1TO = 1 2TOE = 2 3N = 3 4TMP = 3 /* N and TMP don't overlap */ 5 6TEXT memset(SB), $0 7 MOVW R0, R(TO) 8 MOVW data+4(FP), R(4) 9 MOVW n+8(FP), R(N) 10 11 ADD R(N), R(TO), R(TOE) /* to end pointer */ 12 13 CMP $4, R(N) /* need at least 4 bytes to copy */ 14 BLT _1tail 15 16 AND $0xFF, R(4) /* it's a byte */ 17 SLL $8, R(4), R(TMP) /* replicate to a word */ 18 ORR R(TMP), R(4) 19 SLL $16, R(4), R(TMP) 20 ORR R(TMP), R(4) 21 22_4align: /* align on 4 */ 23 AND.S $3, R(TO), R(TMP) 24 BEQ _4aligned 25 26 MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 27 B _4align 28 29_4aligned: 30 SUB $31, R(TOE), R(TMP) /* do 32-byte chunks if possible */ 31 CMP R(TMP), R(TO) 32 BHS _4tail 33 34 MOVW R4, R5 /* replicate */ 35 MOVW R4, R6 36 MOVW R4, R7 37 MOVW R4, R8 38 MOVW R4, R9 39 MOVW R4, R10 40 MOVW R4, R11 41 42_f32loop: 43 CMP R(TMP), R(TO) 44 BHS _4tail 45 46 MOVM.IA.W [R4-R11], (R(TO)) 47 B _f32loop 48 49_4tail: 50 SUB $3, R(TOE), R(TMP) /* do remaining words if possible */ 51_4loop: 52 CMP R(TMP), R(TO) 53 BHS _1tail 54 55 MOVW.P R(4), 4(R(TO)) /* implicit write back */ 56 B _4loop 57 58_1tail: 59 CMP R(TO), R(TOE) 60 BEQ _return 61 62 MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 63 B _1tail 64 65_return: 66 RET 67