1#define BDNZ BC 16,0, 2 TEXT memcpy(SB), $0 3 BR move 4 5 TEXT memmove(SB), $0 6move: 7 8/* 9 * performance: 10 * (tba) 11 */ 12 13 MOVW R3, s1+0(FP) 14 MOVW n+8(FP), R9 /* R9 is count */ 15 MOVW R3, R10 /* R10 is to-pointer */ 16 CMP R9, $0 17 BEQ ret 18 BLT trap 19 MOVW s2+4(FP), R11 /* R11 is from-pointer */ 20 21/* 22 * if no more than 16 bytes, just use one lsw/stsw 23 */ 24 CMP R9, $16 25 BLE fout 26 27 ADD R9,R11, R13 /* R13 is end from-pointer */ 28 ADD R9,R10, R12 /* R12 is end to-pointer */ 29 30/* 31 * easiest test is copy backwards if 32 * destination string has higher mem address 33 */ 34 CMPU R10, R11 35 BGT back 36 37/* 38 * test if both pointers 39 * are similarly word aligned 40 */ 41 XOR R10,R11, R7 42 ANDCC $3,R7 43 BNE fbad 44 45/* 46 * move a few bytes to align pointers 47 */ 48 ANDCC $3,R10,R7 49 BEQ f2 50 SUBC R7, $4, R7 51 SUB R7, R9 52 MOVW R7, XER 53 LSW (R11), R16 54 ADD R7, R11 55 STSW R16, (R10) 56 ADD R7, R10 57 58/* 59 * turn R14 into doubleword count 60 * copy 16 bytes at a time while there's room. 61 */ 62f2: 63 SRAWCC $4, R9, R14 64 BLE fout 65 MOVW R14, CTR 66 SUB $4, R11 67 SUB $4, R10 68f3: 69 MOVWU 4(R11), R16 70 MOVWU R16, 4(R10) 71 MOVWU 4(R11), R17 72 MOVWU R17, 4(R10) 73 MOVWU 4(R11), R16 74 MOVWU R16, 4(R10) 75 MOVWU 4(R11), R17 76 MOVWU R17, 4(R10) 77 BDNZ f3 78 RLWNMCC $0, R9, $15, R9 /* residue */ 79 BEQ ret 80 ADD $4, R11 81 ADD $4, R10 82 83/* 84 * move up to 16 bytes through R16 .. R19; aligned and unaligned 85 */ 86fout: 87 MOVW R9, XER 88 LSW (R11), R16 89 STSW R16, (R10) 90 BR ret 91 92/* 93 * loop for unaligned copy, then copy up to 15 remaining bytes 94 */ 95fbad: 96 SRAWCC $4, R9, R14 97 BLE f6 98 MOVW R14, CTR 99f5: 100 LSW (R11), $16, R16 101 ADD $16, R11 102 STSW R16, $16, (R10) 103 ADD $16, R10 104 BDNZ f5 105 RLWNMCC $0, R9, $15, R9 /* residue */ 106 BEQ ret 107f6: 108 MOVW R9, XER 109 LSW (R11), R16 110 STSW R16, (R10) 111 BR ret 112 113/* 114 * whole thing repeated for backwards 115 */ 116back: 117 CMP R9, $4 118 BLT bout 119 120 XOR R12,R13, R7 121 ANDCC $3,R7 122 BNE bout 123b1: 124 ANDCC $3,R13, R7 125 BEQ b2 126 MOVBZU -1(R13), R16 127 MOVBZU R16, -1(R12) 128 SUB $1, R9 129 BR b1 130b2: 131 SRAWCC $4, R9, R14 132 BLE b4 133 MOVW R14, CTR 134b3: 135 MOVWU -4(R13), R16 136 MOVWU R16, -4(R12) 137 MOVWU -4(R13), R17 138 MOVWU R17, -4(R12) 139 MOVWU -4(R13), R16 140 MOVWU R16, -4(R12) 141 MOVWU -4(R13), R17 142 MOVWU R17, -4(R12) 143 BDNZ b3 144 RLWNMCC $0, R9, $15, R9 /* residue */ 145 BEQ ret 146b4: 147 SRAWCC $2, R9, R14 148 BLE bout 149 MOVW R14, CTR 150b5: 151 MOVWU -4(R13), R16 152 MOVWU R16, -4(R12) 153 BDNZ b5 154 RLWNMCC $0, R9, $3, R9 /* residue */ 155 BEQ ret 156 157bout: 158 CMPU R13, R11 159 BLE ret 160 MOVBZU -1(R13), R16 161 MOVBZU R16, -1(R12) 162 BR bout 163 164trap: 165/* MOVW $0, R0 */ 166 MOVW R0, 0(R0) 167 168ret: 169 MOVW s1+0(FP), R3 170 RETURN 171