17dd7cddfSDavid du Colombier#define BDNZ BC 16,0, 2*6891d857SDavid du Colombier TEXT memmove(SB), $0 37dd7cddfSDavid du Colombier BR move 47dd7cddfSDavid du Colombier 5*6891d857SDavid du Colombier TEXT memcpy(SB), $0 67dd7cddfSDavid du Colombiermove: 77dd7cddfSDavid du Colombier 87dd7cddfSDavid du Colombier/* 97dd7cddfSDavid du Colombier * performance: 107dd7cddfSDavid du Colombier * (tba) 117dd7cddfSDavid du Colombier */ 127dd7cddfSDavid du Colombier 137dd7cddfSDavid du Colombier MOVW R3, s1+0(FP) 147dd7cddfSDavid du Colombier MOVW n+8(FP), R9 /* R9 is count */ 157dd7cddfSDavid du Colombier MOVW R3, R10 /* R10 is to-pointer */ 167dd7cddfSDavid du Colombier CMP R9, $0 177dd7cddfSDavid du Colombier BEQ ret 187dd7cddfSDavid du Colombier BLT trap 197dd7cddfSDavid du Colombier MOVW s2+4(FP), R11 /* R11 is from-pointer */ 207dd7cddfSDavid du Colombier 217dd7cddfSDavid du Colombier/* 227dd7cddfSDavid du Colombier * if no more than 16 bytes, just use one lsw/stsw 237dd7cddfSDavid du Colombier */ 247dd7cddfSDavid du Colombier CMP R9, $16 257dd7cddfSDavid du Colombier BLE fout 267dd7cddfSDavid du Colombier 277dd7cddfSDavid du Colombier ADD R9,R11, R13 /* R13 is end from-pointer */ 287dd7cddfSDavid du Colombier ADD R9,R10, R12 /* R12 is end to-pointer */ 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier/* 317dd7cddfSDavid du Colombier * easiest test is copy backwards if 327dd7cddfSDavid du Colombier * destination string has higher mem address 337dd7cddfSDavid du Colombier */ 347dd7cddfSDavid du Colombier CMPU R10, R11 357dd7cddfSDavid du Colombier BGT back 367dd7cddfSDavid du Colombier 377dd7cddfSDavid du Colombier/* 387dd7cddfSDavid du Colombier * test if both pointers 397dd7cddfSDavid du Colombier * are similarly word aligned 407dd7cddfSDavid du Colombier */ 417dd7cddfSDavid du Colombier XOR R10,R11, R7 427dd7cddfSDavid du Colombier ANDCC $3,R7 437dd7cddfSDavid du Colombier BNE fbad 447dd7cddfSDavid du Colombier 457dd7cddfSDavid du Colombier/* 467dd7cddfSDavid du Colombier * move a few bytes to align pointers 477dd7cddfSDavid du Colombier */ 487dd7cddfSDavid du Colombier ANDCC $3,R10,R7 497dd7cddfSDavid du Colombier BEQ f2 507dd7cddfSDavid du Colombier SUBC R7, $4, R7 517dd7cddfSDavid du Colombier SUB R7, R9 527dd7cddfSDavid du Colombier MOVW R7, XER 537dd7cddfSDavid du Colombier LSW (R11), R16 547dd7cddfSDavid du Colombier ADD R7, R11 557dd7cddfSDavid du Colombier STSW R16, (R10) 567dd7cddfSDavid du Colombier ADD R7, R10 577dd7cddfSDavid du Colombier 587dd7cddfSDavid du Colombier/* 597dd7cddfSDavid du Colombier * turn R14 into doubleword count 607dd7cddfSDavid du Colombier * copy 16 bytes at a time while there's room. 617dd7cddfSDavid du Colombier */ 627dd7cddfSDavid du Colombierf2: 637dd7cddfSDavid du Colombier SRAWCC $4, R9, R14 647dd7cddfSDavid du Colombier BLE fout 657dd7cddfSDavid du Colombier MOVW R14, CTR 667dd7cddfSDavid du Colombier SUB $4, R11 677dd7cddfSDavid du Colombier SUB $4, R10 687dd7cddfSDavid du Colombierf3: 697dd7cddfSDavid du Colombier MOVWU 4(R11), R16 707dd7cddfSDavid du Colombier MOVWU 4(R11), R17 71*6891d857SDavid du Colombier MOVWU 4(R11), R18 72*6891d857SDavid du Colombier MOVWU 4(R11), R19 737dd7cddfSDavid du Colombier MOVWU R16, 4(R10) 747dd7cddfSDavid du Colombier MOVWU R17, 4(R10) 75*6891d857SDavid du Colombier MOVWU R18, 4(R10) 76*6891d857SDavid du Colombier MOVWU R19, 4(R10) 777dd7cddfSDavid du Colombier BDNZ f3 787dd7cddfSDavid du Colombier RLWNMCC $0, R9, $15, R9 /* residue */ 797dd7cddfSDavid du Colombier BEQ ret 807dd7cddfSDavid du Colombier ADD $4, R11 817dd7cddfSDavid du Colombier ADD $4, R10 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier/* 847dd7cddfSDavid du Colombier * move up to 16 bytes through R16 .. R19; aligned and unaligned 857dd7cddfSDavid du Colombier */ 867dd7cddfSDavid du Colombierfout: 877dd7cddfSDavid du Colombier MOVW R9, XER 887dd7cddfSDavid du Colombier LSW (R11), R16 897dd7cddfSDavid du Colombier STSW R16, (R10) 907dd7cddfSDavid du Colombier BR ret 917dd7cddfSDavid du Colombier 927dd7cddfSDavid du Colombier/* 937dd7cddfSDavid du Colombier * loop for unaligned copy, then copy up to 15 remaining bytes 947dd7cddfSDavid du Colombier */ 957dd7cddfSDavid du Colombierfbad: 967dd7cddfSDavid du Colombier SRAWCC $4, R9, R14 977dd7cddfSDavid du Colombier BLE f6 987dd7cddfSDavid du Colombier MOVW R14, CTR 997dd7cddfSDavid du Colombierf5: 1007dd7cddfSDavid du Colombier LSW (R11), $16, R16 1017dd7cddfSDavid du Colombier ADD $16, R11 1027dd7cddfSDavid du Colombier STSW R16, $16, (R10) 1037dd7cddfSDavid du Colombier ADD $16, R10 1047dd7cddfSDavid du Colombier BDNZ f5 1057dd7cddfSDavid du Colombier RLWNMCC $0, R9, $15, R9 /* residue */ 1067dd7cddfSDavid du Colombier BEQ ret 1077dd7cddfSDavid du Colombierf6: 1087dd7cddfSDavid du Colombier MOVW R9, XER 1097dd7cddfSDavid du Colombier LSW (R11), R16 1107dd7cddfSDavid du Colombier STSW R16, (R10) 1117dd7cddfSDavid du Colombier BR ret 1127dd7cddfSDavid du Colombier 1137dd7cddfSDavid du Colombier/* 1147dd7cddfSDavid du Colombier * whole thing repeated for backwards 1157dd7cddfSDavid du Colombier */ 1167dd7cddfSDavid du Colombierback: 1177dd7cddfSDavid du Colombier CMP R9, $4 1187dd7cddfSDavid du Colombier BLT bout 1197dd7cddfSDavid du Colombier 1207dd7cddfSDavid du Colombier XOR R12,R13, R7 1217dd7cddfSDavid du Colombier ANDCC $3,R7 1227dd7cddfSDavid du Colombier BNE bout 1237dd7cddfSDavid du Colombierb1: 1247dd7cddfSDavid du Colombier ANDCC $3,R13, R7 1257dd7cddfSDavid du Colombier BEQ b2 1267dd7cddfSDavid du Colombier MOVBZU -1(R13), R16 1277dd7cddfSDavid du Colombier MOVBZU R16, -1(R12) 1287dd7cddfSDavid du Colombier SUB $1, R9 1297dd7cddfSDavid du Colombier BR b1 1307dd7cddfSDavid du Colombierb2: 1317dd7cddfSDavid du Colombier SRAWCC $4, R9, R14 1327dd7cddfSDavid du Colombier BLE b4 1337dd7cddfSDavid du Colombier MOVW R14, CTR 1347dd7cddfSDavid du Colombierb3: 1357dd7cddfSDavid du Colombier MOVWU -4(R13), R16 1367dd7cddfSDavid du Colombier MOVWU -4(R13), R17 137*6891d857SDavid du Colombier MOVWU -4(R13), R18 138*6891d857SDavid du Colombier MOVWU -4(R13), R19 1397dd7cddfSDavid du Colombier MOVWU R16, -4(R12) 1407dd7cddfSDavid du Colombier MOVWU R17, -4(R12) 141*6891d857SDavid du Colombier MOVWU R18, -4(R12) 142*6891d857SDavid du Colombier MOVWU R19, -4(R12) 1437dd7cddfSDavid du Colombier BDNZ b3 1447dd7cddfSDavid du Colombier RLWNMCC $0, R9, $15, R9 /* residue */ 1457dd7cddfSDavid du Colombier BEQ ret 1467dd7cddfSDavid du Colombierb4: 1477dd7cddfSDavid du Colombier SRAWCC $2, R9, R14 1487dd7cddfSDavid du Colombier BLE bout 1497dd7cddfSDavid du Colombier MOVW R14, CTR 1507dd7cddfSDavid du Colombierb5: 1517dd7cddfSDavid du Colombier MOVWU -4(R13), R16 1527dd7cddfSDavid du Colombier MOVWU R16, -4(R12) 1537dd7cddfSDavid du Colombier BDNZ b5 1547dd7cddfSDavid du Colombier RLWNMCC $0, R9, $3, R9 /* residue */ 1557dd7cddfSDavid du Colombier BEQ ret 1567dd7cddfSDavid du Colombier 1577dd7cddfSDavid du Colombierbout: 1587dd7cddfSDavid du Colombier CMPU R13, R11 1597dd7cddfSDavid du Colombier BLE ret 1607dd7cddfSDavid du Colombier MOVBZU -1(R13), R16 1617dd7cddfSDavid du Colombier MOVBZU R16, -1(R12) 1627dd7cddfSDavid du Colombier BR bout 1637dd7cddfSDavid du Colombier 1647dd7cddfSDavid du Colombiertrap: 1657dd7cddfSDavid du Colombier MOVW $0, R0 1667dd7cddfSDavid du Colombier MOVW 0(R0), R0 1677dd7cddfSDavid du Colombier 1687dd7cddfSDavid du Colombierret: 1697dd7cddfSDavid du Colombier MOVW s1+0(FP), R3 1707dd7cddfSDavid du Colombier RETURN 171