#include "../../../cmd/ld/textflag.h"
#define ZERO_CX BYTE $0x48; \
BYTE $0xc7; \
BYTE $0xc1; \
BYTE $0x00; \
BYTE $0x00; \
BYTE $0x00; \
BYTE $0x00
TEXT ·mulWW(SB),NOSPLIT,$0
MOVQ x+0(FP), AX
MULQ y+8(FP)
MOVQ DX, z1+16(FP)
MOVQ AX, z0+24(FP)
RET
TEXT ·divWW(SB),NOSPLIT,$0
MOVQ x1+0(FP), DX
MOVQ x0+8(FP), AX
DIVQ y+16(FP)
MOVQ AX, q+24(FP)
MOVQ DX, r+32(FP)
RET
TEXT ·addVV(SB),NOSPLIT,$0
MOVQ z_len+8(FP), DI
MOVQ x+24(FP), R8
MOVQ y+48(FP), R9
MOVQ z+0(FP), R10
MOVQ $0, CX
MOVQ $0, SI
SUBQ $4, DI
JL V1
U1:
RCRQ $1, CX
MOVQ 0(R8)(SI*8), R11
MOVQ 8(R8)(SI*8), R12
MOVQ 16(R8)(SI*8), R13
MOVQ 24(R8)(SI*8), R14
ADCQ 0(R9)(SI*8), R11
ADCQ 8(R9)(SI*8), R12
ADCQ 16(R9)(SI*8), R13
ADCQ 24(R9)(SI*8), R14
MOVQ R11, 0(R10)(SI*8)
MOVQ R12, 8(R10)(SI*8)
MOVQ R13, 16(R10)(SI*8)
MOVQ R14, 24(R10)(SI*8)
RCLQ $1, CX
ADDQ $4, SI
SUBQ $4, DI
JGE U1
V1: ADDQ $4, DI
JLE E1
L1:
RCRQ $1, CX
MOVQ 0(R8)(SI*8), R11
ADCQ 0(R9)(SI*8), R11
MOVQ R11, 0(R10)(SI*8)
RCLQ $1, CX
ADDQ $1, SI
SUBQ $1, DI
JG L1
E1: MOVQ CX, c+72(FP)
RET
TEXT ·subVV(SB),NOSPLIT,$0
MOVQ z_len+8(FP), DI
MOVQ x+24(FP), R8
MOVQ y+48(FP), R9
MOVQ z+0(FP), R10
MOVQ $0, CX
MOVQ $0, SI
SUBQ $4, DI
JL V2
U2:
RCRQ $1, CX
MOVQ 0(R8)(SI*8), R11
MOVQ 8(R8)(SI*8), R12
MOVQ 16(R8)(SI*8), R13
MOVQ 24(R8)(SI*8), R14
SBBQ 0(R9)(SI*8), R11
SBBQ 8(R9)(SI*8), R12
SBBQ 16(R9)(SI*8), R13
SBBQ 24(R9)(SI*8), R14
MOVQ R11, 0(R10)(SI*8)
MOVQ R12, 8(R10)(SI*8)
MOVQ R13, 16(R10)(SI*8)
MOVQ R14, 24(R10)(SI*8)
RCLQ $1, CX
ADDQ $4, SI
SUBQ $4, DI
JGE U2
V2: ADDQ $4, DI
JLE E2
L2:
RCRQ $1, CX
MOVQ 0(R8)(SI*8), R11
SBBQ 0(R9)(SI*8), R11
MOVQ R11, 0(R10)(SI*8)
RCLQ $1, CX
ADDQ $1, SI
SUBQ $1, DI
JG L2
E2: MOVQ CX, c+72(FP)
RET
TEXT ·addVW(SB),NOSPLIT,$0
MOVQ z_len+8(FP), DI
MOVQ x+24(FP), R8
MOVQ y+48(FP), CX
MOVQ z+0(FP), R10
MOVQ $0, SI
SUBQ $4, DI
JL V3
U3:
MOVQ 0(R8)(SI*8), R11
MOVQ 8(R8)(SI*8), R12
MOVQ 16(R8)(SI*8), R13
MOVQ 24(R8)(SI*8), R14
ADDQ CX, R11
ZERO_CX
ADCQ $0, R12
ADCQ $0, R13
ADCQ $0, R14
SETCS CX
MOVQ R11, 0(R10)(SI*8)
MOVQ R12, 8(R10)(SI*8)
MOVQ R13, 16(R10)(SI*8)
MOVQ R14, 24(R10)(SI*8)
ADDQ $4, SI
SUBQ $4, DI
JGE U3
V3: ADDQ $4, DI
JLE E3
L3:
ADDQ 0(R8)(SI*8), CX
MOVQ CX, 0(R10)(SI*8)
ZERO_CX
RCLQ $1, CX
ADDQ $1, SI
SUBQ $1, DI
JG L3
E3: MOVQ CX, c+56(FP)
RET
TEXT ·subVW(SB),NOSPLIT,$0
MOVQ z_len+8(FP), DI
MOVQ x+24(FP), R8
MOVQ y+48(FP), CX
MOVQ z+0(FP), R10
MOVQ $0, SI
SUBQ $4, DI
JL V4
U4:
MOVQ 0(R8)(SI*8), R11
MOVQ 8(R8)(SI*8), R12
MOVQ 16(R8)(SI*8), R13
MOVQ 24(R8)(SI*8), R14
SUBQ CX, R11
ZERO_CX
SBBQ $0, R12
SBBQ $0, R13
SBBQ $0, R14
SETCS CX
MOVQ R11, 0(R10)(SI*8)
MOVQ R12, 8(R10)(SI*8)
MOVQ R13, 16(R10)(SI*8)
MOVQ R14, 24(R10)(SI*8)
ADDQ $4, SI
SUBQ $4, DI
JGE U4
V4: ADDQ $4, DI
JLE E4
L4:
MOVQ 0(R8)(SI*8), R11
SUBQ CX, R11
MOVQ R11, 0(R10)(SI*8)
ZERO_CX
RCLQ $1, CX
ADDQ $1, SI
SUBQ $1, DI
JG L4
E4: MOVQ CX, c+56(FP)
RET
TEXT ·shlVU(SB),NOSPLIT,$0
MOVQ z_len+8(FP), BX
SUBQ $1, BX
JL X8b
MOVQ z+0(FP), R10
MOVQ x+24(FP), R8
MOVQ s+48(FP), CX
MOVQ (R8)(BX*8), AX
MOVQ $0, DX
SHLQ CX, DX:AX
MOVQ DX, c+56(FP)
CMPQ BX, $0
JLE X8a
L8: MOVQ AX, DX
MOVQ -8(R8)(BX*8), AX
SHLQ CX, DX:AX
MOVQ DX, (R10)(BX*8)
SUBQ $1, BX
JG L8
X8a: SHLQ CX, AX
MOVQ AX, (R10)
RET
X8b: MOVQ $0, c+56(FP)
RET
TEXT ·shrVU(SB),NOSPLIT,$0
MOVQ z_len+8(FP), R11
SUBQ $1, R11
JL X9b
MOVQ z+0(FP), R10
MOVQ x+24(FP), R8
MOVQ s+48(FP), CX
MOVQ (R8), AX
MOVQ $0, DX
SHRQ CX, DX:AX
MOVQ DX, c+56(FP)
MOVQ $0, BX
JMP E9
L9: MOVQ AX, DX
MOVQ 8(R8)(BX*8), AX
SHRQ CX, DX:AX
MOVQ DX, (R10)(BX*8)
ADDQ $1, BX
E9: CMPQ BX, R11
JL L9
X9a: SHRQ CX, AX
MOVQ AX, (R10)(R11*8)
RET
X9b: MOVQ $0, c+56(FP)
RET
TEXT ·mulAddVWW(SB),NOSPLIT,$0
MOVQ z+0(FP), R10
MOVQ x+24(FP), R8
MOVQ y+48(FP), R9
MOVQ r+56(FP), CX
MOVQ z_len+8(FP), R11
MOVQ $0, BX
JMP E5
L5: MOVQ (R8)(BX*8), AX
MULQ R9
ADDQ CX, AX
ADCQ $0, DX
MOVQ AX, (R10)(BX*8)
MOVQ DX, CX
ADDQ $1, BX
E5: CMPQ BX, R11
JL L5
MOVQ CX, c+64(FP)
RET
TEXT ·addMulVVW(SB),NOSPLIT,$0
MOVQ z+0(FP), R10
MOVQ x+24(FP), R8
MOVQ y+48(FP), R9
MOVQ z_len+8(FP), R11
MOVQ $0, BX
MOVQ $0, CX
JMP E6
L6: MOVQ (R8)(BX*8), AX
MULQ R9
ADDQ CX, AX
ADCQ $0, DX
ADDQ AX, (R10)(BX*8)
ADCQ $0, DX
MOVQ DX, CX
ADDQ $1, BX
E6: CMPQ BX, R11
JL L6
MOVQ CX, c+56(FP)
RET
TEXT ·divWVW(SB),NOSPLIT,$0
MOVQ z+0(FP), R10
MOVQ xn+24(FP), DX
MOVQ x+32(FP), R8
MOVQ y+56(FP), R9
MOVQ z_len+8(FP), BX
JMP E7
L7: MOVQ (R8)(BX*8), AX
DIVQ R9
MOVQ AX, (R10)(BX*8)
E7: SUBQ $1, BX
JGE L7
MOVQ DX, r+64(FP)
RET
TEXT ·bitLen(SB),NOSPLIT,$0
BSRQ x+0(FP), AX
JZ Z1
ADDQ $1, AX
MOVQ AX, n+8(FP)
RET
Z1: MOVQ $0, n+8(FP)
RET