1 TEXT memmove(SB), $0 2 JMP move 3 4 TEXT memcpy(SB), $0 5move: 6 7/* 8 * performance: 9 * (tba) 10 */ 11 12 MOVW R7, s1+0(FP) 13 MOVW n+8(FP), R9 /* R9 is count */ 14 MOVW R7, R10 /* R10 is to-pointer */ 15 SUBCC R0,R9, R0 16 BGE ok 17 MOVW 0(R0), R0 18 19ok: 20 MOVW s2+4(FP), R11 /* R11 is from-pointer */ 21 ADD R9,R11, R13 /* R13 is end from-pointer */ 22 ADD R9,R10, R12 /* R12 is end to-pointer */ 23 24/* 25 * easiest test is copy backwards if 26 * destination string has higher mem address 27 */ 28 SUBCC R11,R10, R0 29 BGU back 30 31/* 32 * if not at least 8 chars, 33 * dont even mess around. 34 * 7 chars to guarantee any 35 * rounding up to a word 36 * boundary and 8 characters 37 * to get at least maybe one 38 * full word store. 39 */ 40 SUBCC $8,R9, R0 41 BL fout 42 43/* 44 * test if both pointers 45 * are similarly word aligned 46 */ 47 XOR R10,R11, R7 48 ANDCC $7,R7, R0 49 BNE fout 50 51/* 52 * byte at a time to double align 53 */ 54f1: 55 ANDCC $7,R10, R0 56 BE f2 57 MOVB 0(R11), R16 58 ADD $1, R11 59 MOVB R16, 0(R10) 60 ADD $1, R10 61 JMP f1 62 63/* 64 * turn R9 into to-end pointer-15 65 * copy 16 at a time while theres room. 66 * R12 is smaller than R13 -- 67 * there are problems if R13 is 0. 68 */ 69f2: 70 SUB $15,R12, R9 71f3: 72 SUBCC R10,R9, R0 73 BLEU f4 74 MOVD 0(R11), R16 75 MOVD R16, 0(R10) 76 MOVD 8(R11), R16 77 ADD $16, R11 78 MOVD R16, 8(R10) 79 ADD $16, R10 80 JMP f3 81 82/* 83 * turn R9 into to-end pointer-3 84 * copy 4 at a time while theres room 85 */ 86f4: 87 SUB $3,R12, R9 88f5: 89 SUBCC R10,R9, R0 90 BLEU fout 91 MOVW 0(R11), R16 92 ADD $4, R11 93 MOVW R16, 0(R10) 94 ADD $4, R10 95 JMP f5 96 97/* 98 * last loop, copy byte at a time 99 */ 100fout: 101 SUBCC R11,R13, R0 102 BLEU ret 103 MOVB 0(R11), R16 104 ADD $1, R11 105 MOVB R16, 0(R10) 106 ADD $1, R10 107 JMP fout 108 109/* 110 * whole thing repeated for backwards 111 */ 112back: 113 SUBCC $8,R9, R0 114 BL bout 115 116 XOR R12,R13, R7 117 ANDCC $7,R7, R0 118 BNE bout 119b1: 120 ANDCC $7,R13, R0 121 BE b2 122 MOVB -1(R13), R16 123 SUB $1, R13 124 MOVB R16, -1(R12) 125 SUB $1, R12 126 JMP b1 127b2: 128 ADD $15,R11, R9 129b3: 130 SUBCC R9,R13, R0 131 BLEU b4 132 133 MOVD -8(R13), R16 134 MOVD R16, -8(R12) 135 MOVD -16(R13), R16 136 SUB $16, R13 137 MOVD R16, -16(R12); 138 SUB $16, R12 139 JMP b3 140b4: 141 ADD $3,R11, R9 142b5: 143 SUBCC R9,R13, R0 144 BLEU bout 145 MOVW -4(R13), R16 146 SUB $4, R13 147 MOVW R16, -4(R12) 148 SUB $4, R12 149 JMP b5 150 151bout: 152 SUBCC R11,R13, R0 153 BLEU ret 154 MOVB -1(R13), R16 155 SUB $1, R13 156 MOVB R16, -1(R12) 157 SUB $1, R12 158 JMP bout 159 160ret: 161 MOVW s1+0(FP), R7 162 RETURN 163