gmsm/sm9/bn256/select_ppc64x.s

289 lines
5.3 KiB
ArmAsm
Raw Normal View History

// Copyright 2024 Sun Yimin. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
//go:build (ppc64 || ppc64le) && !purego
#include "textflag.h"
#define res_ptr R3
#define a_ptr R4
#define b_ptr R5
// func gfpCopy(res, a *gfP)
TEXT ·gfpCopy(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD $16, R10
LXVD2X (a_ptr)(R0), V0
LXVD2X (a_ptr)(R10), V1
STXVD2X V0, (res_ptr)(R0)
STXVD2X V1, (res_ptr)(R10)
RET
#define copyFirst64 \
LXVD2X (a_ptr)(R0), V0 \
LXVD2X (a_ptr)(R6), V1 \
LXVD2X (a_ptr)(R7), V2 \
LXVD2X (a_ptr)(R8), V3 \
STXVD2X V0, (res_ptr)(R0) \
STXVD2X V1, (res_ptr)(R6) \
STXVD2X V2, (res_ptr)(R7) \
STXVD2X V3, (res_ptr)(R8)
#define copyNext64 \
LXVD2X (a_ptr)(R6), V0 \
LXVD2X (a_ptr)(R7), V1 \
LXVD2X (a_ptr)(R8), V2 \
LXVD2X (a_ptr)(R9), V3 \
STXVD2X V0, (res_ptr)(R6) \
STXVD2X V1, (res_ptr)(R7) \
STXVD2X V2, (res_ptr)(R8) \
STXVD2X V3, (res_ptr)(R9) \
// func gfp2Copy(res, a *gfP2)
TEXT ·gfp2Copy(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
copyFirst64
RET
/* ---------------------------------------*/
// func gfp4Copy(res, a *gfP4)
TEXT ·gfp4Copy(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
copyFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
copyNext64
RET
// func gfp6Copy(res, a *gfP6)
TEXT ·gfp6Copy(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
copyFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
copyNext64
MOVD $0x80, R6
MOVD $0x90, R7
MOVD $0xa0, R8
MOVD $0xb0, R9
copyNext64
RET
// func gfp12Copy(res, a *gfP12)
TEXT ·gfp12Copy(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
copyFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
copyNext64
MOVD $0x80, R6
MOVD $0x90, R7
MOVD $0xa0, R8
MOVD $0xb0, R9
copyNext64
MOVD $0xc0, R6
MOVD $0xd0, R7
MOVD $0xe0, R8
MOVD $0xf0, R9
copyNext64
MOVD $0x0100, R6
MOVD $0x0110, R7
MOVD $0x0120, R8
MOVD $0x0130, R9
copyNext64
MOVD $0x0140, R6
MOVD $0x0150, R7
MOVD $0x0160, R8
MOVD $0x0170, R9
copyNext64
RET
#define ZER V10
#define SEL V11
#define moveFirst64 \
LXVD2X (a_ptr)(R0), V0 \
LXVD2X (a_ptr)(R6), V1 \
LXVD2X (a_ptr)(R7), V2 \
LXVD2X (a_ptr)(R8), V3 \
LXVD2X (b_ptr)(R0), V4 \
LXVD2X (b_ptr)(R6), V5 \
LXVD2X (b_ptr)(R7), V6 \
LXVD2X (b_ptr)(R8), V7 \
VSEL V0, V4, SEL, V0 \
VSEL V1, V5, SEL, V1 \
VSEL V2, V6, SEL, V2 \
VSEL V3, V7, SEL, V3 \
STXVD2X V0, (res_ptr)(R0) \
STXVD2X V1, (res_ptr)(R6) \
STXVD2X V2, (res_ptr)(R7) \
STXVD2X V3, (res_ptr)(R8)
#define moveNext64 \
LXVD2X (a_ptr)(R6), V0 \
LXVD2X (a_ptr)(R7), V1 \
LXVD2X (a_ptr)(R8), V2 \
LXVD2X (a_ptr)(R9), V3 \
LXVD2X (b_ptr)(R6), V4 \
LXVD2X (b_ptr)(R7), V5 \
LXVD2X (b_ptr)(R8), V6 \
LXVD2X (b_ptr)(R9), V7 \
VSEL V0, V4, SEL, V0 \
VSEL V1, V5, SEL, V1 \
VSEL V2, V6, SEL, V2 \
VSEL V3, V7, SEL, V3 \
STXVD2X V0, (res_ptr)(R6) \
STXVD2X V1, (res_ptr)(R7) \
STXVD2X V2, (res_ptr)(R8) \
STXVD2X V3, (res_ptr)(R9) \
// func gfP12MovCond(res, a, b *gfP12, cond int)
// If cond == 0 res=b, else res=a
TEXT ·gfP12MovCond(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD b+16(FP), b_ptr
MOVD $56, R21
// cond is R1 + 24 (cond offset) + 32
LXVDSX (R1)(R21), SEL
VSPLTISB $0, ZER
// SEL controls whether to store a or b
VCMPEQUD SEL, ZER, SEL
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
moveFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
moveNext64
MOVD $0x80, R6
MOVD $0x90, R7
MOVD $0xa0, R8
MOVD $0xb0, R9
moveNext64
MOVD $0xc0, R6
MOVD $0xd0, R7
MOVD $0xe0, R8
MOVD $0xf0, R9
moveNext64
MOVD $0x0100, R6
MOVD $0x0110, R7
MOVD $0x0120, R8
MOVD $0x0130, R9
moveNext64
MOVD $0x0140, R6
MOVD $0x0150, R7
MOVD $0x0160, R8
MOVD $0x0170, R9
moveNext64
RET
// func curvePointMovCond(res, a, b *curvePoint, cond int)
// If cond == 0 res=b, else res=a
TEXT ·curvePointMovCond(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD b+16(FP), b_ptr
MOVD $56, R21
// cond is R1 + 24 (cond offset) + 32
LXVDSX (R1)(R21), SEL
VSPLTISB $0, ZER
// SEL controls whether to store a or b
VCMPEQUD SEL, ZER, SEL
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
moveFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
moveNext64
RET
// func twistPointMovCond(res, a, b *twistPoint, cond int)
// If cond == 0 res=b, else res=a
TEXT ·twistPointMovCond(SB),NOSPLIT,$0
MOVD res+0(FP), res_ptr
MOVD a+8(FP), a_ptr
MOVD b+16(FP), b_ptr
MOVD $56, R21
// cond is R1 + 24 (cond offset) + 32
LXVDSX (R1)(R21), SEL
VSPLTISB $0, ZER
// SEL controls whether to store a or b
VCMPEQUD SEL, ZER, SEL
MOVD $16, R6
MOVD $32, R7
MOVD $48, R8
moveFirst64
MOVD $0x40, R6
MOVD $0x50, R7
MOVD $0x60, R8
MOVD $0x70, R9
moveNext64
MOVD $0x80, R6
MOVD $0x90, R7
MOVD $0xa0, R8
MOVD $0xb0, R9
moveNext64
MOVD $0xc0, R6
MOVD $0xd0, R7
MOVD $0xe0, R8
MOVD $0xf0, R9
moveNext64
RET