📄 memmove.s
字号:
TEXT memmove(SB), $0 JMP move TEXT memcpy(SB), $0move:/* * performance: * (tba) */ MOVW R7, s1+0(FP) MOVW n+8(FP), R9 /* R9 is count */ MOVW R7, R10 /* R10 is to-pointer */ SUBCC R0,R9, R0 BGE ok MOVW 0(R0), R0ok: MOVW s2+4(FP), R11 /* R11 is from-pointer */ ADD R9,R11, R13 /* R13 is end from-pointer */ ADD R9,R10, R12 /* R12 is end to-pointer *//* * easiest test is copy backwards if * destination string has higher mem address */ SUBCC R11,R10, R0 BGU back/* * if not at least 8 chars, * dont even mess around. * 7 chars to guarantee any * rounding up to a word * boundary and 8 characters * to get at least maybe one * full word store. */ SUBCC $8,R9, R0 BL fout/* * test if both pointers * are similarly word aligned */ XOR R10,R11, R7 ANDCC $7,R7, R0 BNE fout/* * byte at a time to double align */f1: ANDCC $7,R10, R0 BE f2 MOVB 0(R11), R16 ADD $1, R11 MOVB R16, 0(R10) ADD $1, R10 JMP f1/* * turn R9 into to-end pointer-15 * copy 16 at a time while theres room. * R12 is smaller than R13 -- * there are problems if R13 is 0. */f2: SUB $15,R12, R9f3: SUBCC R10,R9, R0 BLEU f4 MOVD 0(R11), R16 MOVD R16, 0(R10) MOVD 8(R11), R16 ADD $16, R11 MOVD R16, 8(R10) ADD $16, R10 JMP f3/* * turn R9 into to-end pointer-3 * copy 4 at a time while theres room */f4: SUB $3,R12, R9f5: SUBCC R10,R9, R0 BLEU fout MOVW 0(R11), R16 ADD $4, R11 MOVW R16, 0(R10) ADD $4, R10 JMP f5/* * last loop, copy byte at a time */fout: SUBCC R11,R13, R0 BLEU ret MOVB 0(R11), R16 ADD $1, R11 MOVB R16, 0(R10) ADD $1, R10 JMP fout/* * whole thing repeated for backwards */back: SUBCC $8,R9, R0 BL bout XOR R12,R13, R7 ANDCC $7,R7, R0 BNE boutb1: ANDCC $7,R13, R0 BE b2 MOVB -1(R13), R16 SUB $1, R13 MOVB R16, -1(R12) SUB $1, R12 JMP b1b2: ADD $15,R11, R9b3: SUBCC R9,R13, R0 BLEU b4 MOVD -8(R13), R16 MOVD R16, -8(R12) MOVD -16(R13), R16 SUB $16, R13 MOVD R16, -16(R12); SUB $16, R12 JMP b3b4: ADD $3,R11, R9b5: SUBCC R9,R13, R0 BLEU bout MOVW -4(R13), R16 SUB $4, R13 MOVW R16, -4(R12) SUB $4, R12 JMP b5bout: SUBCC R11,R13, R0 BLEU ret MOVB -1(R13), R16 SUB $1, R13 MOVB R16, -1(R12) SUB $1, R12 JMP boutret: MOVW s1+0(FP), R7 RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -