diff --git a/internal/sm2ec/p256_asm_ord.go b/internal/sm2ec/p256_asm_ord.go index c154f27..928eac0 100644 --- a/internal/sm2ec/p256_asm_ord.go +++ b/internal/sm2ec/p256_asm_ord.go @@ -1,4 +1,4 @@ -//go:build (amd64 || arm64 || s390x) && !purego +//go:build (amd64 || arm64 || s390x || ppc64le) && !purego package sm2ec diff --git a/internal/sm2ec/p256_asm_ord_test.go b/internal/sm2ec/p256_asm_ord_test.go index 77b216e..8be1a47 100644 --- a/internal/sm2ec/p256_asm_ord_test.go +++ b/internal/sm2ec/p256_asm_ord_test.go @@ -1,4 +1,4 @@ -//go:build (amd64 || arm64 || s390x) && !purego +//go:build (amd64 || arm64 || s390x || ppc64le) && !purego package sm2ec diff --git a/internal/sm2ec/p256_asm_ppc64le.s b/internal/sm2ec/p256_asm_ppc64le.s index b5fd9bf..ae3d54b 100644 --- a/internal/sm2ec/p256_asm_ppc64le.s +++ b/internal/sm2ec/p256_asm_ppc64le.s @@ -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 diff --git a/internal/sm2ec/sm2p256_ord.go b/internal/sm2ec/sm2p256_ord.go index 31df591..3b08265 100644 --- a/internal/sm2ec/sm2p256_ord.go +++ b/internal/sm2ec/sm2p256_ord.go @@ -1,4 +1,4 @@ -//go:build purego || !(amd64 || arm64 || s390x) +//go:build purego || !(amd64 || arm64 || s390x || ppc64le) package sm2ec