mpvecdigmulsub.s
来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· S 代码 · 共 67 行
S
67 行
#define BDNZ BC 16,0,#define BDNE BC 0,2,#define BLT BC 0xC,0,/* * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p -= b*m * * each step looks like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * b = R3 * n = R4 * m = R5 * p = R6 * i = R7 * hi = R8 - constrained by hardware * lo = R9 - constrained by hardware * oldhi = R10 * tmp = R11 * borrow = R12 * */TEXT mpvecdigmulsub(SB),$0 MOVW n+4(FP),R10 MOVW R10,CTR MOVW m+8(FP),R5 MOVW p+12(FP),R6 SUB $4, R3 /* pre decrement for MOVWU's */ SUBC $4, R6 /* pre decrement for MOVWU's and set carry */ MOVW XER,R12 MOVW R0, R10 _mulsubloop: MOVWU 4(R3),R9 /* lo = b[i] */ MOVW 4(R6),R11 /* tmp = p[i] */ MULHWU R9,R5,R8 /* hi = (b[i] * m)>>32 */ MULLW R9,R5,R9 /* lo = b[i] * m */ ADDC R10,R9 /* lo += oldhi */ ADDE R0,R8 /* hi += carry */ MOVW R12,XER SUBE R9,R11 /* tmp -= lo */ MOVW XER,R12 MOVWU R11,4(R6) /* p[i] = tmp */ MOVW R8,R10 /* oldhi = hi */ BDNZ _mulsubloop MOVW 4(R6),R11 /* tmp = p[i] */ MOVW R12,XER SUBE R10,R11 /* tmp -= lo */ MOVWU R11,4(R6) /* p[i] = tmp */ /* return -1 if the result was negative, +1 otherwise */ SUBECC R0,R0,R3 BLT _mulsub2 MOVW $1,R3_mulsub2: RETURN
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?