github.com/smalaichami/go-bowhead@v0.0.0-20180311002552-16302db95eaa/crypto/bn256/cloudflare/gfp_amd64.s (about)

     1  // +build amd64,!appengine,!gccgo
     2  
     3  #include "gfp.h"
     4  #include "mul.h"
     5  #include "mul_bmi2.h"
     6  
     7  TEXT ·gfpNeg(SB),0,$0-16
     8  	MOVQ ·p2+0(SB), R8
     9  	MOVQ ·p2+8(SB), R9
    10  	MOVQ ·p2+16(SB), R10
    11  	MOVQ ·p2+24(SB), R11
    12  
    13  	MOVQ a+8(FP), DI
    14  	SUBQ 0(DI), R8
    15  	SBBQ 8(DI), R9
    16  	SBBQ 16(DI), R10
    17  	SBBQ 24(DI), R11
    18  
    19  	MOVQ $0, AX
    20  	gfpCarry(R8,R9,R10,R11,AX, R12,R13,R14,R15,BX)
    21  
    22  	MOVQ c+0(FP), DI
    23  	storeBlock(R8,R9,R10,R11, 0(DI))
    24  	RET
    25  
    26  TEXT ·gfpAdd(SB),0,$0-24
    27  	MOVQ a+8(FP), DI
    28  	MOVQ b+16(FP), SI
    29  
    30  	loadBlock(0(DI), R8,R9,R10,R11)
    31  	MOVQ $0, R12
    32  
    33  	ADDQ  0(SI), R8
    34  	ADCQ  8(SI), R9
    35  	ADCQ 16(SI), R10
    36  	ADCQ 24(SI), R11
    37  	ADCQ $0, R12
    38  
    39  	gfpCarry(R8,R9,R10,R11,R12, R13,R14,R15,AX,BX)
    40  
    41  	MOVQ c+0(FP), DI
    42  	storeBlock(R8,R9,R10,R11, 0(DI))
    43  	RET
    44  
    45  TEXT ·gfpSub(SB),0,$0-24
    46  	MOVQ a+8(FP), DI
    47  	MOVQ b+16(FP), SI
    48  
    49  	loadBlock(0(DI), R8,R9,R10,R11)
    50  
    51  	MOVQ ·p2+0(SB), R12
    52  	MOVQ ·p2+8(SB), R13
    53  	MOVQ ·p2+16(SB), R14
    54  	MOVQ ·p2+24(SB), R15
    55  	MOVQ $0, AX
    56  
    57  	SUBQ  0(SI), R8
    58  	SBBQ  8(SI), R9
    59  	SBBQ 16(SI), R10
    60  	SBBQ 24(SI), R11
    61  
    62  	CMOVQCC AX, R12
    63  	CMOVQCC AX, R13
    64  	CMOVQCC AX, R14
    65  	CMOVQCC AX, R15
    66  
    67  	ADDQ R12, R8
    68  	ADCQ R13, R9
    69  	ADCQ R14, R10
    70  	ADCQ R15, R11
    71  
    72  	MOVQ c+0(FP), DI
    73  	storeBlock(R8,R9,R10,R11, 0(DI))
    74  	RET
    75  
    76  TEXT ·gfpMul(SB),0,$160-24
    77  	MOVQ a+8(FP), DI
    78  	MOVQ b+16(FP), SI
    79  
    80  	// Jump to a slightly different implementation if MULX isn't supported.
    81  	CMPB runtime·support_bmi2(SB), $0
    82  	JE   nobmi2Mul
    83  
    84  	mulBMI2(0(DI),8(DI),16(DI),24(DI), 0(SI))
    85  	storeBlock( R8, R9,R10,R11,  0(SP))
    86  	storeBlock(R12,R13,R14,R15, 32(SP))
    87  	gfpReduceBMI2()
    88  	JMP end
    89  
    90  nobmi2Mul:
    91  	mul(0(DI),8(DI),16(DI),24(DI), 0(SI), 0(SP))
    92  	gfpReduce(0(SP))
    93  
    94  end:
    95  	MOVQ c+0(FP), DI
    96  	storeBlock(R12,R13,R14,R15, 0(DI))
    97  	RET