17dd7cddfSDavid du ColombierTO = 1 27dd7cddfSDavid du ColombierTOE = 2 37dd7cddfSDavid du ColombierN = 3 47dd7cddfSDavid du ColombierTMP = 3 /* N and TMP don't overlap */ 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du ColombierTEXT memset(SB), $0 77dd7cddfSDavid du Colombier MOVW R0, R(TO) 87dd7cddfSDavid du Colombier MOVW data+4(FP), R(4) 97dd7cddfSDavid du Colombier MOVW n+8(FP), R(N) 107dd7cddfSDavid du Colombier 117dd7cddfSDavid du Colombier ADD R(N), R(TO), R(TOE) /* to end pointer */ 127dd7cddfSDavid du Colombier 137dd7cddfSDavid du Colombier CMP $4, R(N) /* need at least 4 bytes to copy */ 147dd7cddfSDavid du Colombier BLT _1tail 157dd7cddfSDavid du Colombier 1680ee5cbfSDavid du Colombier AND $0xFF, R(4) 1780ee5cbfSDavid du Colombier ORR R(4)<<8, R(4) 1880ee5cbfSDavid du Colombier ORR R(4)<<16, R(4) /* replicate to word */ 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier_4align: /* align on 4 */ 217dd7cddfSDavid du Colombier AND.S $3, R(TO), R(TMP) 227dd7cddfSDavid du Colombier BEQ _4aligned 237dd7cddfSDavid du Colombier 247dd7cddfSDavid du Colombier MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 257dd7cddfSDavid du Colombier B _4align 267dd7cddfSDavid du Colombier 277dd7cddfSDavid du Colombier_4aligned: 28*51480713SDavid du Colombier SUB $15, R(TOE), R(TMP) /* do 16-byte chunks if possible */ 297dd7cddfSDavid du Colombier CMP R(TMP), R(TO) 307dd7cddfSDavid du Colombier BHS _4tail 317dd7cddfSDavid du Colombier 327dd7cddfSDavid du Colombier MOVW R4, R5 /* replicate */ 337dd7cddfSDavid du Colombier MOVW R4, R6 347dd7cddfSDavid du Colombier MOVW R4, R7 357dd7cddfSDavid du Colombier 36*51480713SDavid du Colombier_f16loop: 377dd7cddfSDavid du Colombier CMP R(TMP), R(TO) 387dd7cddfSDavid du Colombier BHS _4tail 397dd7cddfSDavid du Colombier 40*51480713SDavid du Colombier MOVM.IA.W [R4-R7], (R(TO)) 41*51480713SDavid du Colombier B _f16loop 427dd7cddfSDavid du Colombier 437dd7cddfSDavid du Colombier_4tail: 447dd7cddfSDavid du Colombier SUB $3, R(TOE), R(TMP) /* do remaining words if possible */ 457dd7cddfSDavid du Colombier_4loop: 467dd7cddfSDavid du Colombier CMP R(TMP), R(TO) 477dd7cddfSDavid du Colombier BHS _1tail 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier MOVW.P R(4), 4(R(TO)) /* implicit write back */ 507dd7cddfSDavid du Colombier B _4loop 517dd7cddfSDavid du Colombier 527dd7cddfSDavid du Colombier_1tail: 537dd7cddfSDavid du Colombier CMP R(TO), R(TOE) 547dd7cddfSDavid du Colombier BEQ _return 557dd7cddfSDavid du Colombier 567dd7cddfSDavid du Colombier MOVBU.P R(4), 1(R(TO)) /* implicit write back */ 577dd7cddfSDavid du Colombier B _1tail 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier_return: 607dd7cddfSDavid du Colombier RET 61