1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/arch/arm/lib/io-writesw-armv3.S 4 * 5 * Copyright (C) 1995-2000 Russell King 6 */ 7#include <linux/linkage.h> 8#include <asm/assembler.h> 9 10.Loutsw_bad_alignment: 11 adr r0, .Loutsw_bad_align_msg 12 mov r2, lr 13 b panic 14.Loutsw_bad_align_msg: 15 .asciz "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n" 16 .align 17 18.Loutsw_align: tst r1, #1 19 bne .Loutsw_bad_alignment 20 21 add r1, r1, #2 22 23 ldr r3, [r1, #-4] 24 mov r3, r3, lsr #16 25 orr r3, r3, r3, lsl #16 26 str r3, [r0] 27 subs r2, r2, #1 28 reteq lr 29 30ENTRY(__raw_writesw) 31 teq r2, #0 @ do we have to check for the zero len? 32 reteq lr 33 tst r1, #3 34 bne .Loutsw_align 35 36 stmfd sp!, {r4, r5, r6, lr} 37 38 subs r2, r2, #8 39 bmi .Lno_outsw_8 40 41.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, r6} 42 43 mov ip, r3, lsl #16 44 orr ip, ip, ip, lsr #16 45 str ip, [r0] 46 47 mov ip, r3, lsr #16 48 orr ip, ip, ip, lsl #16 49 str ip, [r0] 50 51 mov ip, r4, lsl #16 52 orr ip, ip, ip, lsr #16 53 str ip, [r0] 54 55 mov ip, r4, lsr #16 56 orr ip, ip, ip, lsl #16 57 str ip, [r0] 58 59 mov ip, r5, lsl #16 60 orr ip, ip, ip, lsr #16 61 str ip, [r0] 62 63 mov ip, r5, lsr #16 64 orr ip, ip, ip, lsl #16 65 str ip, [r0] 66 67 mov ip, r6, lsl #16 68 orr ip, ip, ip, lsr #16 69 str ip, [r0] 70 71 mov ip, r6, lsr #16 72 orr ip, ip, ip, lsl #16 73 str ip, [r0] 74 75 subs r2, r2, #8 76 bpl .Loutsw_8_lp 77 78 tst r2, #7 79 ldmfdeq sp!, {r4, r5, r6, pc} 80 81.Lno_outsw_8: tst r2, #4 82 beq .Lno_outsw_4 83 84 ldmia r1!, {r3, r4} 85 86 mov ip, r3, lsl #16 87 orr ip, ip, ip, lsr #16 88 str ip, [r0] 89 90 mov ip, r3, lsr #16 91 orr ip, ip, ip, lsl #16 92 str ip, [r0] 93 94 mov ip, r4, lsl #16 95 orr ip, ip, ip, lsr #16 96 str ip, [r0] 97 98 mov ip, r4, lsr #16 99 orr ip, ip, ip, lsl #16 100 str ip, [r0] 101 102.Lno_outsw_4: tst r2, #2 103 beq .Lno_outsw_2 104 105 ldr r3, [r1], #4 106 107 mov ip, r3, lsl #16 108 orr ip, ip, ip, lsr #16 109 str ip, [r0] 110 111 mov ip, r3, lsr #16 112 orr ip, ip, ip, lsl #16 113 str ip, [r0] 114 115.Lno_outsw_2: tst r2, #1 116 117 ldrne r3, [r1] 118 119 movne ip, r3, lsl #16 120 orrne ip, ip, ip, lsr #16 121 strne ip, [r0] 122 123 ldmfd sp!, {r4, r5, r6, pc} 124