77 lines
1.3 KiB
ArmAsm
77 lines
1.3 KiB
ArmAsm
// 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
|