mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-27 04:36:19 +08:00
internal/sm2ec: ppc64le order mul/sqr
This commit is contained in:
parent
f0b36b70ce
commit
c198fa8abc
@ -1,4 +1,4 @@
|
||||
//go:build (amd64 || arm64 || s390x) && !purego
|
||||
//go:build (amd64 || arm64 || s390x || ppc64le) && !purego
|
||||
|
||||
package sm2ec
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
//go:build (amd64 || arm64 || s390x) && !purego
|
||||
//go:build (amd64 || arm64 || s390x || ppc64le) && !purego
|
||||
|
||||
package sm2ec
|
||||
|
||||
|
@ -39,7 +39,8 @@
|
||||
// The following constants are defined in an order
|
||||
// that is correct for use with LXVD2X/STXVD2X
|
||||
// on little endian.
|
||||
DATA p256ordK0<>+0x00(SB)/4, $0x72350975
|
||||
DATA p256ordK0<>+0x00(SB)/8, $0x72350975723509
|
||||
DATA p256ordK0<>+0x08(SB)/8, $0x72350975723509
|
||||
DATA p256ord<>+0x00(SB)/8, $0xfffffffeffffffff
|
||||
DATA p256ord<>+0x08(SB)/8, $0xffffffffffffffff
|
||||
DATA p256ord<>+0x10(SB)/8, $0x7203df6b21c6052b
|
||||
@ -64,7 +65,7 @@ DATA p256mul<>+0x50(SB)/8, $0x0000000100000000 // (1*2^256)%P256
|
||||
DATA p256mul<>+0x58(SB)/8, $0x0000000000000000 // (1*2^256)%P256
|
||||
|
||||
// External declarations for constants
|
||||
GLOBL p256ordK0<>(SB), 8, $4
|
||||
GLOBL p256ordK0<>(SB), 8, $16
|
||||
GLOBL p256ord<>(SB), 8, $32
|
||||
GLOBL p256<>(SB), 8, $48
|
||||
GLOBL p256mul<>(SB), 8, $96
|
||||
@ -498,6 +499,561 @@ loop_select:
|
||||
#undef SEL1
|
||||
#undef SEL2
|
||||
|
||||
// ---------------------------------------
|
||||
// sm2p256OrdMulInternal
|
||||
#define X0 V0
|
||||
#define X1 V1
|
||||
#define Y0 V2
|
||||
#define Y1 V3
|
||||
#define M1 V4
|
||||
#define M0 V5
|
||||
#define T0 V6
|
||||
#define T1 V7
|
||||
#define T2 V8
|
||||
#define YDIG V9
|
||||
|
||||
#define ADD1 V16
|
||||
#define ADD1H V17
|
||||
#define ADD2 V18
|
||||
#define ADD2H V19
|
||||
#define RED1 V20
|
||||
#define RED1H V21
|
||||
#define RED2 V22
|
||||
#define RED2H V23
|
||||
#define CAR1 V24
|
||||
#define CAR1M V25
|
||||
|
||||
#define MK0 V30
|
||||
#define K0 V31
|
||||
|
||||
// TMP1, TMP2 used in
|
||||
// VMULT macros
|
||||
#define TMP1 V13
|
||||
#define TMP2 V27
|
||||
#define ONE V29 // 1s splatted by word
|
||||
|
||||
TEXT sm2p256OrdMulInternal<>(SB), NOSPLIT, $0
|
||||
// ---------------------------------------------------------------------------/
|
||||
// VREPF $3, Y0, YDIG
|
||||
VSPLTW $3, Y0, YDIG
|
||||
VSPLTISW $1, ONE
|
||||
|
||||
// VMLF X0, YDIG, ADD1
|
||||
// VMLF X1, YDIG, ADD2
|
||||
// VMLHF X0, YDIG, ADD1H
|
||||
// VMLHF X1, YDIG, ADD2H
|
||||
VMULT(X0, YDIG, ADD1, ADD1H)
|
||||
VMULT(X1, YDIG, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSPLTISB $0, T2 // VZERO T2
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1 // VSLDB
|
||||
VSLDOI $12, T2, RED2, RED2 // VSLDB
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
/* *
|
||||
* ---+--------+--------+
|
||||
* T2| T1 | T0 |
|
||||
* ---+--------+--------+
|
||||
* *(add)*
|
||||
* +--------+--------+
|
||||
* | X1 | X0 |
|
||||
* +--------+--------+
|
||||
* *(mul)*
|
||||
* +--------+--------+
|
||||
* | YDIG | YDIG |
|
||||
* +--------+--------+
|
||||
* *(add)*
|
||||
* +--------+--------+
|
||||
* | M1 | M0 |
|
||||
* +--------+--------+
|
||||
* *(mul)*
|
||||
* +--------+--------+
|
||||
* | MK0 | MK0 |
|
||||
* +--------+--------+
|
||||
*
|
||||
* ---------------------
|
||||
*
|
||||
* +--------+--------+
|
||||
* | ADD2 | ADD1 |
|
||||
* +--------+--------+
|
||||
* +--------+--------+
|
||||
* | ADD2H | ADD1H |
|
||||
* +--------+--------+
|
||||
* +--------+--------+
|
||||
* | RED2 | RED1 |
|
||||
* +--------+--------+
|
||||
* +--------+--------+
|
||||
* | RED2H | RED1H |
|
||||
* +--------+--------+
|
||||
*/
|
||||
// VREPF $2, Y0, YDIG
|
||||
VSPLTW $2, Y0, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1 // VSLDB
|
||||
VSLDOI $12, T2, RED2, RED2 // VSLDB
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $1, Y0, YDIG
|
||||
VSPLTW $1, Y0, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1 // VSLDB
|
||||
VSLDOI $12, T2, RED2, RED2 // VSLDB
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $0, Y0, YDIG
|
||||
VSPLTW $0, Y0, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1
|
||||
VSLDOI $12, T2, RED2, RED2
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $3, Y1, YDIG
|
||||
VSPLTW $3, Y1, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1
|
||||
VSLDOI $12, T2, RED2, RED2
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $2, Y1, YDIG
|
||||
VSPLTW $2, Y1, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1
|
||||
VSLDOI $12, T2, RED2, RED2
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $1, Y1, YDIG
|
||||
VSPLTW $1, Y1, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1
|
||||
VSLDOI $12, T2, RED2, RED2
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
// VREPF $0, Y1, YDIG
|
||||
VSPLTW $0, Y1, YDIG
|
||||
|
||||
// VMALF X0, YDIG, T0, ADD1
|
||||
// VMALF X1, YDIG, T1, ADD2
|
||||
// VMALHF X0, YDIG, T0, ADD1H
|
||||
// VMALHF X1, YDIG, T1, ADD2H
|
||||
VMULT_ADD(X0, YDIG, T0, ADD1, ADD1H)
|
||||
VMULT_ADD(X1, YDIG, T1, ADD2, ADD2H)
|
||||
|
||||
// VMLF ADD1, K0, MK0
|
||||
// VREPF $3, MK0, MK0
|
||||
VMULEUW ADD1, K0, TMP1
|
||||
VMULOUW ADD1, K0, TMP2
|
||||
VMRGOW TMP1, TMP2, MK0
|
||||
VSPLTW $3, MK0, MK0
|
||||
|
||||
// VMALF M0, MK0, ADD1, RED1
|
||||
// VMALHF M0, MK0, ADD1, RED1H
|
||||
// VMALF M1, MK0, ADD2, RED2
|
||||
// VMALHF M1, MK0, ADD2, RED2H
|
||||
VMULT_ADD(M0, MK0, ADD1, ONE, ADD1, RED1H)
|
||||
VMULT_ADD(M1, MK1, ADD2, ONE, ADD2, RED2H)
|
||||
|
||||
VSLDOI $12, RED2, RED1, RED1
|
||||
VSLDOI $12, T2, RED2, RED2
|
||||
|
||||
VADDCUQ RED1, ADD1H, CAR1 // VACCQ
|
||||
VADDUQM RED1, ADD1H, T0 // VAQ
|
||||
VADDCUQ RED1H, T0, CAR1M // VACCQ
|
||||
VADDUQM RED1H, T0, T0 // VAQ
|
||||
|
||||
// << ready for next MK0
|
||||
|
||||
VADDEUQM RED2, ADD2H, CAR1, T1 // VACQ
|
||||
VADDECUQ RED2, ADD2H, CAR1, CAR1 // VACCCQ
|
||||
VADDECUQ RED2H, T1, CAR1M, T2 // VACCCQ
|
||||
VADDEUQM RED2H, T1, CAR1M, T1 // VACQ
|
||||
VADDUQM CAR1, T2, T2 // VAQ
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
// VZERO RED1
|
||||
// VSCBIQ M0, T0, CAR1
|
||||
// VSQ M0, T0, ADD1
|
||||
// VSBCBIQ T1, M1, CAR1, CAR1M
|
||||
// VSBIQ T1, M1, CAR1, ADD2
|
||||
// VSBIQ T2, RED1, CAR1M, T2
|
||||
VSPLTISB $0, RED1 // VZERO RED1
|
||||
VSUBCUQ T0, M0, CAR1 // VSCBIQ
|
||||
VSUBUQM T0, M0, ADD1 // VSQ
|
||||
VSUBECUQ T1, M1, CAR1, CAR1M // VSBCBIQ
|
||||
VSUBEUQM T1, M1, CAR1, ADD2 // VSBIQ
|
||||
VSUBEUQM T2, RED1, CAR1M, T2 // VSBIQ
|
||||
|
||||
// what output to use, ADD2||ADD1 or T1||T0?
|
||||
VSEL ADD1, T0, T2, T0
|
||||
VSEL ADD2, T0, T2, T1
|
||||
RET
|
||||
|
||||
#undef X0
|
||||
#undef X1
|
||||
#undef Y0
|
||||
#undef Y1
|
||||
#undef M0
|
||||
#undef M1
|
||||
#undef T0
|
||||
#undef T1
|
||||
#undef T2
|
||||
#undef YDIG
|
||||
|
||||
#undef ADD1
|
||||
#undef ADD1H
|
||||
#undef ADD2
|
||||
#undef ADD2H
|
||||
#undef RED1
|
||||
#undef RED1H
|
||||
#undef RED2
|
||||
#undef RED2H
|
||||
#undef CAR1
|
||||
#undef CAR1M
|
||||
|
||||
#undef MK0
|
||||
#undef K0
|
||||
#undef TMP1
|
||||
#undef TMP2
|
||||
#undef ONE
|
||||
|
||||
// ---------------------------------------
|
||||
|
||||
// func p256OrdMul(res, in1, in2 *p256OrdElement)
|
||||
#define res_ptr R3
|
||||
#define x_ptr R4
|
||||
#define y_ptr R5
|
||||
#define CPOOL R7
|
||||
#define N R8
|
||||
|
||||
#define X0 V0
|
||||
#define X1 V1
|
||||
#define Y0 V2
|
||||
#define Y1 V3
|
||||
#define M0 V5
|
||||
#define M1 V4
|
||||
#define T0 V6
|
||||
#define T1 V7
|
||||
#define K0 V31
|
||||
TEXT ·p256OrdMul(SB), NOSPLIT, $0-24
|
||||
MOVD res+0(FP), res_ptr
|
||||
MOVD in1+8(FP), x_ptr
|
||||
MOVD in2+16(FP), y_ptr
|
||||
MOVD $16, R16
|
||||
|
||||
LXVD2X (R0)(x_ptr), X0
|
||||
LXVD2X (R16)(x_ptr), X1
|
||||
|
||||
XXPERMDI X0, X0, $2, X0
|
||||
XXPERMDI X1, X1, $2, X1
|
||||
|
||||
LXVD2X (R0)(y_ptr), Y0
|
||||
LXVD2X (R16)(y_ptr), Y1
|
||||
|
||||
XXPERMDI Y0, Y0, $2, Y0
|
||||
XXPERMDI Y1, Y1, $2, Y1
|
||||
|
||||
MOVD $p256ord<>+0x00(SB), CPOOL
|
||||
LXVD2X (R16)(CPOOL), M0
|
||||
LXVD2X (R0)(CPOOL), M1
|
||||
|
||||
// Can use VSPLTISW $0x72350975, K0 instead
|
||||
MOVD $p256ordK0<>+0x00(SB), CPOOL
|
||||
LXVD2X (R0)(CPOOL), K0
|
||||
|
||||
CALL sm2p256OrdMulInternal<>(SB)
|
||||
|
||||
XXPERMDI T0, T0, $2, T0
|
||||
XXPERMDI T1, T1, $2, T1
|
||||
STXVD2X T0, (R0)(res_ptr)
|
||||
STXVD2X T1, (R16)(res_ptr)
|
||||
|
||||
RET
|
||||
|
||||
// func p256OrdSqr(res, in *p256Element, n int)
|
||||
TEXT ·p256OrdSqr(SB), NOSPLIT, $0-24
|
||||
MOVD res+0(FP), res_ptr
|
||||
MOVD in+8(FP), x_ptr
|
||||
MOVD n+16(FP), N
|
||||
MOVD $16, R16
|
||||
|
||||
LXVD2X (R0)(x_ptr), X0
|
||||
LXVD2X (R16)(x_ptr), X1
|
||||
|
||||
XXPERMDI X0, X0, $2, X0
|
||||
XXPERMDI X1, X1, $2, X1
|
||||
|
||||
MOVD $p256ord<>+0x00(SB), CPOOL
|
||||
LXVD2X (R16)(CPOOL), M0
|
||||
LXVD2X (R0)(CPOOL), M1
|
||||
|
||||
// Can use VSPLTISW $0x72350975, K0 instead
|
||||
MOVD $p256ordK0<>+0x00(SB), CPOOL
|
||||
LXVD2X (R0)(CPOOL), K0
|
||||
|
||||
sqrOrdLoop:
|
||||
// Sqr uses same value for both
|
||||
|
||||
VOR X0, X0, Y0
|
||||
VOR X1, X1, Y1
|
||||
CALL sm2p256OrdMulInternal<>(SB)
|
||||
|
||||
ADD $-1, N
|
||||
CMP $0, N
|
||||
BEQ done
|
||||
|
||||
VOR T0, T0, X0
|
||||
VOR T1, T1, X1
|
||||
BR sqrOrdLoop
|
||||
|
||||
RET
|
||||
|
||||
#undef res_ptr
|
||||
#undef x_ptr
|
||||
#undef y_ptr
|
||||
#undef CPOOL
|
||||
#undef N
|
||||
#undef X0
|
||||
#undef X1
|
||||
#undef Y0
|
||||
#undef Y1
|
||||
#undef M0
|
||||
#undef M1
|
||||
#undef T0
|
||||
#undef T1
|
||||
#undef K0
|
||||
|
||||
#define res_ptr R3
|
||||
#define x_ptr R4
|
||||
#define CPOOL R7
|
||||
@ -545,10 +1101,10 @@ TEXT ·p256FromMont(SB), NOSPLIT, $0-16
|
||||
XXPERMDI T1, T1, $2, T1
|
||||
|
||||
// First round
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VSLDOI $4, TT0, ZER, RED2 // d1 d0 0 0
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBUQM RED1, TT0, RED1 // VSQ TT0, RED1, RED1
|
||||
VSUBEUQM RED2, TT0, CAR1, RED2 // VSBIQ RED2, TT0, CAR1, RED2 // Guaranteed not to underflow
|
||||
|
||||
@ -562,10 +1118,10 @@ TEXT ·p256FromMont(SB), NOSPLIT, $0-16
|
||||
VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2
|
||||
|
||||
// Second round
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VSLDOI $4, TT0, ZER, RED2 // d1 d0 0 0
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBUQM RED1, TT0, RED1 // VSQ TT0, RED1, RED1
|
||||
VSUBEUQM RED2, TT0, CAR1, RED2 // VSBIQ RED2, TT0, CAR1, RED2 // Guaranteed not to underflow
|
||||
|
||||
@ -579,10 +1135,10 @@ TEXT ·p256FromMont(SB), NOSPLIT, $0-16
|
||||
VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2
|
||||
|
||||
// Third round
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VSLDOI $4, TT0, ZER, RED2 // d1 d0 0 0
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBUQM RED1, TT0, RED1 // VSQ TT0, RED1, RED1
|
||||
VSUBEUQM RED2, TT0, CAR1, RED2 // VSBIQ RED2, TT0, CAR1, RED2 // Guaranteed not to underflow
|
||||
|
||||
@ -596,10 +1152,10 @@ TEXT ·p256FromMont(SB), NOSPLIT, $0-16
|
||||
VADDUQM T2, CAR2, T2 // VAQ T2, CAR2, T2
|
||||
|
||||
// Last round
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VPERM ZER, T0, SEL1, RED1 // 0 0 d1 d0
|
||||
VSLDOI $4, RED1, ZER, TT0 // 0 d1 d0 0
|
||||
VSLDOI $4, TT0, ZER, RED2 // d1 d0 0 0
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBCUQ RED1, TT0, CAR1 // VSCBIQ TT0, RED1, CAR1
|
||||
VSUBUQM RED1, TT0, RED1 // VSQ TT0, RED1, RED1
|
||||
VSUBEUQM RED2, TT0, CAR1, RED2 // VSBIQ RED2, TT0, CAR1, RED2 // Guaranteed not to underflow
|
||||
|
||||
@ -1123,7 +1679,6 @@ TEXT ·p256Mul(SB), NOSPLIT, $0-24
|
||||
|
||||
MOVD $p256mul<>+0x00(SB), CPOOL
|
||||
|
||||
|
||||
LXVD2X (R0)(x_ptr), X0
|
||||
LXVD2X (R16)(x_ptr), X1
|
||||
|
||||
@ -1141,7 +1696,7 @@ TEXT ·p256Mul(SB), NOSPLIT, $0-24
|
||||
|
||||
CALL sm2p256MulInternal<>(SB)
|
||||
|
||||
MOVD $p256mul<>+0x00(SB), CPOOL
|
||||
MOVD $p256mul<>+0x00(SB), CPOOL // What's the purpose of this?
|
||||
|
||||
XXPERMDI T0, T0, $2, T0
|
||||
XXPERMDI T1, T1, $2, T1
|
||||
@ -1185,7 +1740,7 @@ sqrLoop:
|
||||
BR sqrLoop
|
||||
|
||||
done:
|
||||
MOVD $p256mul<>+0x00(SB), CPOOL
|
||||
MOVD $p256mul<>+0x00(SB), CPOOL // What's the purpose of this?
|
||||
|
||||
XXPERMDI T0, T0, $2, T0
|
||||
XXPERMDI T1, T1, $2, T1
|
||||
|
@ -1,4 +1,4 @@
|
||||
//go:build purego || !(amd64 || arm64 || s390x)
|
||||
//go:build purego || !(amd64 || arm64 || s390x || ppc64le)
|
||||
|
||||
package sm2ec
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user