// Carry arithmetic, rotates, unsigned/signed division and bit tests: the // scalar families GOROOT's big-number and crypto kernels use. Every result // is folded back so no instruction is dead. #include "textflag.h" // func carry(a, b uint64) uint64 TEXT ·carry(SB), NOSPLIT, $0-24 MOVQ a+0(FP), AX MOVQ b+8(FP), BX ADDQ BX, AX ADCQ $0, AX MOVQ BX, CX SBBQ $1, CX ADCL BX, AX ADCB AL, BL ADCW $7, CX MOVQ AX, ret+16(FP) RET // func borrow(a, b uint64) uint64 TEXT ·borrow(SB), NOSPLIT, $0-24 MOVQ a+0(FP), AX MOVQ b+8(FP), BX SUBQ BX, AX SBBQ $0, AX SBBQ BX, CX MOVQ AX, ret+16(FP) RET // func rot(x uint64, n uint32) uint64 TEXT ·rot(SB), NOSPLIT, $0-24 MOVQ x+0(FP), AX MOVL n+8(FP), CX ROLQ CL, AX RORQ $7, AX ROLL $1, AX RORL CL, AX RCLQ $1, AX RCRQ CL, AX ROLW $3, AX SALQ $2, AX SALB $1, AX MOVQ AX, ret+8(FP) RET // func muldiv(a, b uint64) uint64 TEXT ·muldiv(SB), NOSPLIT, $0-24 MOVQ a+0(FP), AX MOVQ b+8(FP), BX MULQ BX MULQ (BX) MOVL (BX), CX MULL CX DIVQ BX IDIVQ BX MOVL a+0(FP), AX DIVL CX IDIVL CX MOVQ AX, ret+16(FP) RET // func bitfield(w *uint64) uint64 TEXT ·bitfield(SB), NOSPLIT, $0-16 MOVQ (DI), AX MOVQ (DI), CX BTQ AX, CX BTQ $3, (DI) BTL AX, CX BTW $1, CX BTSQ $5, AX BTRQ AX, CX BTCQ $7, (DI) SETCS AL MOVQ AX, ret+8(FP) RET