internal/sm2ec: ppc64le order mul/sqr

This commit is contained in:
Sun Yimin 2024-08-29 10:02:16 +08:00 committed by GitHub
parent f0b36b70ce
commit c198fa8abc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 575 additions and 20 deletions

View File

@ -1,4 +1,4 @@
//go:build (amd64 || arm64 || s390x) && !purego
//go:build (amd64 || arm64 || s390x || ppc64le) && !purego
package sm2ec

View File

@ -1,4 +1,4 @@
//go:build (amd64 || arm64 || s390x) && !purego
//go:build (amd64 || arm64 || s390x || ppc64le) && !purego
package sm2ec

View File

@ -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

View File

@ -1,4 +1,4 @@
//go:build purego || !(amd64 || arm64 || s390x)
//go:build purego || !(amd64 || arm64 || s390x || ppc64le)
package sm2ec