// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -pkg bigmod. DO NOT EDIT.

//go:build !purego

// func addMulVVW1024(z *uint, x *uint, y uint) (c uint)
// Requires: ADX, BMI2
TEXT ·addMulVVW1024(SB), $0-32
	CMPB ·supportADX+0(SB), $0x01
	JEQ  adx
	MOVQ z+0(FP), CX
	MOVQ x+8(FP), BX
	MOVQ y+16(FP), SI
	XORQ DI, DI

	// Iteration 0
	MOVQ (BX), AX
	MULQ SI
	ADDQ (CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, (CX)

	// Iteration 1
	MOVQ 8(BX), AX
	MULQ SI
	ADDQ 8(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 8(CX)

	// Iteration 2
	MOVQ 16(BX), AX
	MULQ SI
	ADDQ 16(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 16(CX)

	// Iteration 3
	MOVQ 24(BX), AX
	MULQ SI
	ADDQ 24(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 24(CX)

	// Iteration 4
	MOVQ 32(BX), AX
	MULQ SI
	ADDQ 32(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 32(CX)

	// Iteration 5
	MOVQ 40(BX), AX
	MULQ SI
	ADDQ 40(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 40(CX)

	// Iteration 6
	MOVQ 48(BX), AX
	MULQ SI
	ADDQ 48(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 48(CX)

	// Iteration 7
	MOVQ 56(BX), AX
	MULQ SI
	ADDQ 56(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 56(CX)

	// Iteration 8
	MOVQ 64(BX), AX
	MULQ SI
	ADDQ 64(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 64(CX)

	// Iteration 9
	MOVQ 72(BX), AX
	MULQ SI
	ADDQ 72(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 72(CX)

	// Iteration 10
	MOVQ 80(BX), AX
	MULQ SI
	ADDQ 80(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 80(CX)

	// Iteration 11
	MOVQ 88(BX), AX
	MULQ SI
	ADDQ 88(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 88(CX)

	// Iteration 12
	MOVQ 96(BX), AX
	MULQ SI
	ADDQ 96(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 96(CX)

	// Iteration 13
	MOVQ 104(BX), AX
	MULQ SI
	ADDQ 104(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 104(CX)

	// Iteration 14
	MOVQ 112(BX), AX
	MULQ SI
	ADDQ 112(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 112(CX)

	// Iteration 15
	MOVQ 120(BX), AX
	MULQ SI
	ADDQ 120(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 120(CX)
	MOVQ DI, c+24(FP)
	RET

adx:
	MOVQ z+0(FP), AX
	MOVQ x+8(FP), CX
	MOVQ y+16(FP), DX
	XORQ BX, BX
	XORQ SI, SI

	// Iteration 0
	MULXQ (CX), R8, DI
	ADCXQ BX, R8
	ADOXQ (AX), R8
	MOVQ  R8, (AX)

	// Iteration 1
	MULXQ 8(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 8(AX), R8
	MOVQ  R8, 8(AX)

	// Iteration 2
	MULXQ 16(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 16(AX), R8
	MOVQ  R8, 16(AX)

	// Iteration 3
	MULXQ 24(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 24(AX), R8
	MOVQ  R8, 24(AX)

	// Iteration 4
	MULXQ 32(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 32(AX), R8
	MOVQ  R8, 32(AX)

	// Iteration 5
	MULXQ 40(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 40(AX), R8
	MOVQ  R8, 40(AX)

	// Iteration 6
	MULXQ 48(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 48(AX), R8
	MOVQ  R8, 48(AX)

	// Iteration 7
	MULXQ 56(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 56(AX), R8
	MOVQ  R8, 56(AX)

	// Iteration 8
	MULXQ 64(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 64(AX), R8
	MOVQ  R8, 64(AX)

	// Iteration 9
	MULXQ 72(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 72(AX), R8
	MOVQ  R8, 72(AX)

	// Iteration 10
	MULXQ 80(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 80(AX), R8
	MOVQ  R8, 80(AX)

	// Iteration 11
	MULXQ 88(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 88(AX), R8
	MOVQ  R8, 88(AX)

	// Iteration 12
	MULXQ 96(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 96(AX), R8
	MOVQ  R8, 96(AX)

	// Iteration 13
	MULXQ 104(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 104(AX), R8
	MOVQ  R8, 104(AX)

	// Iteration 14
	MULXQ 112(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 112(AX), R8
	MOVQ  R8, 112(AX)

	// Iteration 15
	MULXQ 120(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 120(AX), R8
	MOVQ  R8, 120(AX)

	// Add back carry flags and return
	ADCXQ SI, BX
	ADOXQ SI, BX
	MOVQ  BX, c+24(FP)
	RET

// func addMulVVW1536(z *uint, x *uint, y uint) (c uint)
// Requires: ADX, BMI2
TEXT ·addMulVVW1536(SB), $0-32
	CMPB ·supportADX+0(SB), $0x01
	JEQ  adx
	MOVQ z+0(FP), CX
	MOVQ x+8(FP), BX
	MOVQ y+16(FP), SI
	XORQ DI, DI

	// Iteration 0
	MOVQ (BX), AX
	MULQ SI
	ADDQ (CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, (CX)

	// Iteration 1
	MOVQ 8(BX), AX
	MULQ SI
	ADDQ 8(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 8(CX)

	// Iteration 2
	MOVQ 16(BX), AX
	MULQ SI
	ADDQ 16(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 16(CX)

	// Iteration 3
	MOVQ 24(BX), AX
	MULQ SI
	ADDQ 24(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 24(CX)

	// Iteration 4
	MOVQ 32(BX), AX
	MULQ SI
	ADDQ 32(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 32(CX)

	// Iteration 5
	MOVQ 40(BX), AX
	MULQ SI
	ADDQ 40(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 40(CX)

	// Iteration 6
	MOVQ 48(BX), AX
	MULQ SI
	ADDQ 48(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 48(CX)

	// Iteration 7
	MOVQ 56(BX), AX
	MULQ SI
	ADDQ 56(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 56(CX)

	// Iteration 8
	MOVQ 64(BX), AX
	MULQ SI
	ADDQ 64(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 64(CX)

	// Iteration 9
	MOVQ 72(BX), AX
	MULQ SI
	ADDQ 72(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 72(CX)

	// Iteration 10
	MOVQ 80(BX), AX
	MULQ SI
	ADDQ 80(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 80(CX)

	// Iteration 11
	MOVQ 88(BX), AX
	MULQ SI
	ADDQ 88(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 88(CX)

	// Iteration 12
	MOVQ 96(BX), AX
	MULQ SI
	ADDQ 96(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 96(CX)

	// Iteration 13
	MOVQ 104(BX), AX
	MULQ SI
	ADDQ 104(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 104(CX)

	// Iteration 14
	MOVQ 112(BX), AX
	MULQ SI
	ADDQ 112(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 112(CX)

	// Iteration 15
	MOVQ 120(BX), AX
	MULQ SI
	ADDQ 120(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 120(CX)

	// Iteration 16
	MOVQ 128(BX), AX
	MULQ SI
	ADDQ 128(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 128(CX)

	// Iteration 17
	MOVQ 136(BX), AX
	MULQ SI
	ADDQ 136(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 136(CX)

	// Iteration 18
	MOVQ 144(BX), AX
	MULQ SI
	ADDQ 144(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 144(CX)

	// Iteration 19
	MOVQ 152(BX), AX
	MULQ SI
	ADDQ 152(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 152(CX)

	// Iteration 20
	MOVQ 160(BX), AX
	MULQ SI
	ADDQ 160(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 160(CX)

	// Iteration 21
	MOVQ 168(BX), AX
	MULQ SI
	ADDQ 168(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 168(CX)

	// Iteration 22
	MOVQ 176(BX), AX
	MULQ SI
	ADDQ 176(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 176(CX)

	// Iteration 23
	MOVQ 184(BX), AX
	MULQ SI
	ADDQ 184(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 184(CX)
	MOVQ DI, c+24(FP)
	RET

adx:
	MOVQ z+0(FP), AX
	MOVQ x+8(FP), CX
	MOVQ y+16(FP), DX
	XORQ BX, BX
	XORQ SI, SI

	// Iteration 0
	MULXQ (CX), R8, DI
	ADCXQ BX, R8
	ADOXQ (AX), R8
	MOVQ  R8, (AX)

	// Iteration 1
	MULXQ 8(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 8(AX), R8
	MOVQ  R8, 8(AX)

	// Iteration 2
	MULXQ 16(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 16(AX), R8
	MOVQ  R8, 16(AX)

	// Iteration 3
	MULXQ 24(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 24(AX), R8
	MOVQ  R8, 24(AX)

	// Iteration 4
	MULXQ 32(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 32(AX), R8
	MOVQ  R8, 32(AX)

	// Iteration 5
	MULXQ 40(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 40(AX), R8
	MOVQ  R8, 40(AX)

	// Iteration 6
	MULXQ 48(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 48(AX), R8
	MOVQ  R8, 48(AX)

	// Iteration 7
	MULXQ 56(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 56(AX), R8
	MOVQ  R8, 56(AX)

	// Iteration 8
	MULXQ 64(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 64(AX), R8
	MOVQ  R8, 64(AX)

	// Iteration 9
	MULXQ 72(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 72(AX), R8
	MOVQ  R8, 72(AX)

	// Iteration 10
	MULXQ 80(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 80(AX), R8
	MOVQ  R8, 80(AX)

	// Iteration 11
	MULXQ 88(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 88(AX), R8
	MOVQ  R8, 88(AX)

	// Iteration 12
	MULXQ 96(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 96(AX), R8
	MOVQ  R8, 96(AX)

	// Iteration 13
	MULXQ 104(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 104(AX), R8
	MOVQ  R8, 104(AX)

	// Iteration 14
	MULXQ 112(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 112(AX), R8
	MOVQ  R8, 112(AX)

	// Iteration 15
	MULXQ 120(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 120(AX), R8
	MOVQ  R8, 120(AX)

	// Iteration 16
	MULXQ 128(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 128(AX), R8
	MOVQ  R8, 128(AX)

	// Iteration 17
	MULXQ 136(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 136(AX), R8
	MOVQ  R8, 136(AX)

	// Iteration 18
	MULXQ 144(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 144(AX), R8
	MOVQ  R8, 144(AX)

	// Iteration 19
	MULXQ 152(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 152(AX), R8
	MOVQ  R8, 152(AX)

	// Iteration 20
	MULXQ 160(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 160(AX), R8
	MOVQ  R8, 160(AX)

	// Iteration 21
	MULXQ 168(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 168(AX), R8
	MOVQ  R8, 168(AX)

	// Iteration 22
	MULXQ 176(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 176(AX), R8
	MOVQ  R8, 176(AX)

	// Iteration 23
	MULXQ 184(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 184(AX), R8
	MOVQ  R8, 184(AX)

	// Add back carry flags and return
	ADCXQ SI, BX
	ADOXQ SI, BX
	MOVQ  BX, c+24(FP)
	RET

// func addMulVVW2048(z *uint, x *uint, y uint) (c uint)
// Requires: ADX, BMI2
TEXT ·addMulVVW2048(SB), $0-32
	CMPB ·supportADX+0(SB), $0x01
	JEQ  adx
	MOVQ z+0(FP), CX
	MOVQ x+8(FP), BX
	MOVQ y+16(FP), SI
	XORQ DI, DI

	// Iteration 0
	MOVQ (BX), AX
	MULQ SI
	ADDQ (CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, (CX)

	// Iteration 1
	MOVQ 8(BX), AX
	MULQ SI
	ADDQ 8(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 8(CX)

	// Iteration 2
	MOVQ 16(BX), AX
	MULQ SI
	ADDQ 16(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 16(CX)

	// Iteration 3
	MOVQ 24(BX), AX
	MULQ SI
	ADDQ 24(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 24(CX)

	// Iteration 4
	MOVQ 32(BX), AX
	MULQ SI
	ADDQ 32(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 32(CX)

	// Iteration 5
	MOVQ 40(BX), AX
	MULQ SI
	ADDQ 40(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 40(CX)

	// Iteration 6
	MOVQ 48(BX), AX
	MULQ SI
	ADDQ 48(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 48(CX)

	// Iteration 7
	MOVQ 56(BX), AX
	MULQ SI
	ADDQ 56(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 56(CX)

	// Iteration 8
	MOVQ 64(BX), AX
	MULQ SI
	ADDQ 64(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 64(CX)

	// Iteration 9
	MOVQ 72(BX), AX
	MULQ SI
	ADDQ 72(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 72(CX)

	// Iteration 10
	MOVQ 80(BX), AX
	MULQ SI
	ADDQ 80(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 80(CX)

	// Iteration 11
	MOVQ 88(BX), AX
	MULQ SI
	ADDQ 88(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 88(CX)

	// Iteration 12
	MOVQ 96(BX), AX
	MULQ SI
	ADDQ 96(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 96(CX)

	// Iteration 13
	MOVQ 104(BX), AX
	MULQ SI
	ADDQ 104(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 104(CX)

	// Iteration 14
	MOVQ 112(BX), AX
	MULQ SI
	ADDQ 112(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 112(CX)

	// Iteration 15
	MOVQ 120(BX), AX
	MULQ SI
	ADDQ 120(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 120(CX)

	// Iteration 16
	MOVQ 128(BX), AX
	MULQ SI
	ADDQ 128(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 128(CX)

	// Iteration 17
	MOVQ 136(BX), AX
	MULQ SI
	ADDQ 136(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 136(CX)

	// Iteration 18
	MOVQ 144(BX), AX
	MULQ SI
	ADDQ 144(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 144(CX)

	// Iteration 19
	MOVQ 152(BX), AX
	MULQ SI
	ADDQ 152(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 152(CX)

	// Iteration 20
	MOVQ 160(BX), AX
	MULQ SI
	ADDQ 160(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 160(CX)

	// Iteration 21
	MOVQ 168(BX), AX
	MULQ SI
	ADDQ 168(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 168(CX)

	// Iteration 22
	MOVQ 176(BX), AX
	MULQ SI
	ADDQ 176(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 176(CX)

	// Iteration 23
	MOVQ 184(BX), AX
	MULQ SI
	ADDQ 184(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 184(CX)

	// Iteration 24
	MOVQ 192(BX), AX
	MULQ SI
	ADDQ 192(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 192(CX)

	// Iteration 25
	MOVQ 200(BX), AX
	MULQ SI
	ADDQ 200(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 200(CX)

	// Iteration 26
	MOVQ 208(BX), AX
	MULQ SI
	ADDQ 208(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 208(CX)

	// Iteration 27
	MOVQ 216(BX), AX
	MULQ SI
	ADDQ 216(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 216(CX)

	// Iteration 28
	MOVQ 224(BX), AX
	MULQ SI
	ADDQ 224(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 224(CX)

	// Iteration 29
	MOVQ 232(BX), AX
	MULQ SI
	ADDQ 232(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 232(CX)

	// Iteration 30
	MOVQ 240(BX), AX
	MULQ SI
	ADDQ 240(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 240(CX)

	// Iteration 31
	MOVQ 248(BX), AX
	MULQ SI
	ADDQ 248(CX), AX
	ADCQ $0x00, DX
	ADDQ DI, AX
	ADCQ $0x00, DX
	MOVQ DX, DI
	MOVQ AX, 248(CX)
	MOVQ DI, c+24(FP)
	RET

adx:
	MOVQ z+0(FP), AX
	MOVQ x+8(FP), CX
	MOVQ y+16(FP), DX
	XORQ BX, BX
	XORQ SI, SI

	// Iteration 0
	MULXQ (CX), R8, DI
	ADCXQ BX, R8
	ADOXQ (AX), R8
	MOVQ  R8, (AX)

	// Iteration 1
	MULXQ 8(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 8(AX), R8
	MOVQ  R8, 8(AX)

	// Iteration 2
	MULXQ 16(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 16(AX), R8
	MOVQ  R8, 16(AX)

	// Iteration 3
	MULXQ 24(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 24(AX), R8
	MOVQ  R8, 24(AX)

	// Iteration 4
	MULXQ 32(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 32(AX), R8
	MOVQ  R8, 32(AX)

	// Iteration 5
	MULXQ 40(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 40(AX), R8
	MOVQ  R8, 40(AX)

	// Iteration 6
	MULXQ 48(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 48(AX), R8
	MOVQ  R8, 48(AX)

	// Iteration 7
	MULXQ 56(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 56(AX), R8
	MOVQ  R8, 56(AX)

	// Iteration 8
	MULXQ 64(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 64(AX), R8
	MOVQ  R8, 64(AX)

	// Iteration 9
	MULXQ 72(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 72(AX), R8
	MOVQ  R8, 72(AX)

	// Iteration 10
	MULXQ 80(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 80(AX), R8
	MOVQ  R8, 80(AX)

	// Iteration 11
	MULXQ 88(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 88(AX), R8
	MOVQ  R8, 88(AX)

	// Iteration 12
	MULXQ 96(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 96(AX), R8
	MOVQ  R8, 96(AX)

	// Iteration 13
	MULXQ 104(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 104(AX), R8
	MOVQ  R8, 104(AX)

	// Iteration 14
	MULXQ 112(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 112(AX), R8
	MOVQ  R8, 112(AX)

	// Iteration 15
	MULXQ 120(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 120(AX), R8
	MOVQ  R8, 120(AX)

	// Iteration 16
	MULXQ 128(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 128(AX), R8
	MOVQ  R8, 128(AX)

	// Iteration 17
	MULXQ 136(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 136(AX), R8
	MOVQ  R8, 136(AX)

	// Iteration 18
	MULXQ 144(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 144(AX), R8
	MOVQ  R8, 144(AX)

	// Iteration 19
	MULXQ 152(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 152(AX), R8
	MOVQ  R8, 152(AX)

	// Iteration 20
	MULXQ 160(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 160(AX), R8
	MOVQ  R8, 160(AX)

	// Iteration 21
	MULXQ 168(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 168(AX), R8
	MOVQ  R8, 168(AX)

	// Iteration 22
	MULXQ 176(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 176(AX), R8
	MOVQ  R8, 176(AX)

	// Iteration 23
	MULXQ 184(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 184(AX), R8
	MOVQ  R8, 184(AX)

	// Iteration 24
	MULXQ 192(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 192(AX), R8
	MOVQ  R8, 192(AX)

	// Iteration 25
	MULXQ 200(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 200(AX), R8
	MOVQ  R8, 200(AX)

	// Iteration 26
	MULXQ 208(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 208(AX), R8
	MOVQ  R8, 208(AX)

	// Iteration 27
	MULXQ 216(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 216(AX), R8
	MOVQ  R8, 216(AX)

	// Iteration 28
	MULXQ 224(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 224(AX), R8
	MOVQ  R8, 224(AX)

	// Iteration 29
	MULXQ 232(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 232(AX), R8
	MOVQ  R8, 232(AX)

	// Iteration 30
	MULXQ 240(CX), R8, DI
	ADCXQ BX, R8
	ADOXQ 240(AX), R8
	MOVQ  R8, 240(AX)

	// Iteration 31
	MULXQ 248(CX), R8, BX
	ADCXQ DI, R8
	ADOXQ 248(AX), R8
	MOVQ  R8, 248(AX)

	// Add back carry flags and return
	ADCXQ SI, BX
	ADOXQ SI, BX
	MOVQ  BX, c+24(FP)
	RET
