180ee5cbfSDavid du ColombierTO = 1 280ee5cbfSDavid du ColombierTOE = 2 380ee5cbfSDavid du ColombierN = 3 480ee5cbfSDavid du ColombierTMP = 3 /* N and TMP don't overlap */ 580ee5cbfSDavid du Colombier 680ee5cbfSDavid du ColombierTEXT memset(SB), $0 780ee5cbfSDavid du Colombier MOVW R0, R(TO) 880ee5cbfSDavid du Colombier MOVW data+4(FP), R(4) 980ee5cbfSDavid du Colombier MOVW n+8(FP), R(N) 1080ee5cbfSDavid du Colombier 1180ee5cbfSDavid du Colombier ADD R(N), R(TO), R(TOE) /* to end pointer */ 1280ee5cbfSDavid du Colombier 1380ee5cbfSDavid du Colombier CMP $4, R(N) /* need at least 4 bytes to copy */ 1480ee5cbfSDavid du Colombier BLT _1tail 1580ee5cbfSDavid du Colombier 162ddf2468SDavid du Colombier AND $0xFF, R(4) 172ddf2468SDavid du Colombier ORR R(4)<<8, R(4) 182ddf2468SDavid du Colombier ORR R(4)<<16, R(4) /* replicate to word */ 1980ee5cbfSDavid du Colombier 2080ee5cbfSDavid du Colombier_4align: /* align on 4 */ 2180ee5cbfSDavid du Colombier AND.S $3, R(TO), R(TMP) 2280ee5cbfSDavid du Colombier BEQ _4aligned 2380ee5cbfSDavid du Colombier 2480ee5cbfSDavid du Colombier MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 2580ee5cbfSDavid du Colombier B _4align 2680ee5cbfSDavid du Colombier 2780ee5cbfSDavid du Colombier_4aligned: 28*51480713SDavid du Colombier SUB $15, R(TOE), R(TMP) /* do 16-byte chunks if possible */ 2980ee5cbfSDavid du Colombier CMP R(TMP), R(TO) 3080ee5cbfSDavid du Colombier BHS _4tail 3180ee5cbfSDavid du Colombier 3280ee5cbfSDavid du Colombier MOVW R4, R5 /* replicate */ 3380ee5cbfSDavid du Colombier MOVW R4, R6 3480ee5cbfSDavid du Colombier MOVW R4, R7 3580ee5cbfSDavid du Colombier 36*51480713SDavid du Colombier_f16loop: 3780ee5cbfSDavid du Colombier CMP R(TMP), R(TO) 3880ee5cbfSDavid du Colombier BHS _4tail 3980ee5cbfSDavid du Colombier 40*51480713SDavid du Colombier MOVM.IA.W [R4-R7], (R(TO)) 41*51480713SDavid du Colombier B _f16loop 4280ee5cbfSDavid du Colombier 4380ee5cbfSDavid du Colombier_4tail: 4480ee5cbfSDavid du Colombier SUB $3, R(TOE), R(TMP) /* do remaining words if possible */ 4580ee5cbfSDavid du Colombier_4loop: 4680ee5cbfSDavid du Colombier CMP R(TMP), R(TO) 4780ee5cbfSDavid du Colombier BHS _1tail 4880ee5cbfSDavid du Colombier 4980ee5cbfSDavid du Colombier MOVW.P R(4), 4(R(TO)) /* implicit write back */ 5080ee5cbfSDavid du Colombier B _4loop 5180ee5cbfSDavid du Colombier 5280ee5cbfSDavid du Colombier_1tail: 5380ee5cbfSDavid du Colombier CMP R(TO), R(TOE) 5480ee5cbfSDavid du Colombier BEQ _return 5580ee5cbfSDavid du Colombier 5680ee5cbfSDavid du Colombier MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 5780ee5cbfSDavid du Colombier B _1tail 5880ee5cbfSDavid du Colombier 5980ee5cbfSDavid du Colombier_return: 6080ee5cbfSDavid du Colombier RET 61