2024-10-06 10:45:20 +08:00
|
|
|
// 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 \
|
2024-10-06 11:39:19 +08:00
|
|
|
VSEL V0, V4, SEL, V0 \
|
|
|
|
VSEL V1, V5, SEL, V1 \
|
|
|
|
VSEL V2, V6, SEL, V2 \
|
|
|
|
VSEL V3, V7, SEL, V3 \
|
2024-10-06 10:45:20 +08:00
|
|
|
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 \
|
2024-10-06 11:39:19 +08:00
|
|
|
VSEL V0, V4, SEL, V0 \
|
|
|
|
VSEL V1, V5, SEL, V1 \
|
|
|
|
VSEL V2, V6, SEL, V2 \
|
|
|
|
VSEL V3, V7, SEL, V3 \
|
2024-10-06 10:45:20 +08:00
|
|
|
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
|