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) 17 ORR R(4)<<8, R(4) 18 ORR R(4)<<16, R(4) /* replicate to word */ 19 20_4align: /* align on 4 */ 21 AND.S $3, R(TO), R(TMP) 22 BEQ _4aligned 23 24 MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 25 B _4align 26 27_4aligned: 28 SUB $15, R(TOE), R(TMP) /* do 16-byte chunks if possible */ 29 CMP R(TMP), R(TO) 30 BHS _4tail 31 32 MOVW R4, R5 /* replicate */ 33 MOVW R4, R6 34 MOVW R4, R7 35 36_f16loop: 37 CMP R(TMP), R(TO) 38 BHS _4tail 39 40 MOVM.IA.W [R4-R7], (R(TO)) 41 B _f16loop 42 43_4tail: 44 SUB $3, R(TOE), R(TMP) /* do remaining words if possible */ 45_4loop: 46 CMP R(TMP), R(TO) 47 BHS _1tail 48 49 MOVW.P R(4), 4(R(TO)) /* implicit write back */ 50 B _4loop 51 52_1tail: 53 CMP R(TO), R(TOE) 54 BEQ _return 55 56 MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 57 B _1tail 58 59_return: 60 RET 61