Files
xgcl/sm/sm2/ec256/c256_asm_speed_test.go
T
2026-05-27 23:03:00 +08:00

113 lines
3.2 KiB
Go

//go:build (amd64 || arm64) && !generic && !generic32 && !generic64
// +build amd64 arm64
// +build !generic
// +build !generic32
// +build !generic64
package ec256
import (
"fmt"
"math/big"
"testing"
"time"
)
func pointFromBig(x, y *big.Int) []uint64 {
xyz := make([]uint64, 12)
fromBig(xyz[0:4], maybeReduceModP(x))
fromBig(xyz[4:8], maybeReduceModP(y))
c256Mul(xyz[0:4], xyz[0:4], rr[:])
c256Mul(xyz[4:8], xyz[4:8], rr[:])
xyz[8] = montOne0
xyz[9] = montOne1
xyz[10] = montOne2
xyz[11] = montOne3
return xyz
}
// func TestC256AddSpeed(t *testing.T) {
// a := []uint64{0x715A4589334C74C7, 0x8FE30BBFF2660BE1, 0x5F9904466A39C994, 0x32C4AE2C1F198119}
// b := []uint64{0x715A4589334C74C7, 0x8FE30BBFF2660BE1, 0x5F9904466A39C994, 0x32C4AE2C1F198119}
// res := make([]uint64, 4)
// begin := time.Now()
// total := 1000000000
// for i := 0; i < total; i++ {
// c256Add(res, a, b)
// }
// elaspe := time.Since(begin)
// fmt.Println("time: ", elaspe.Milliseconds(), "ms")
// fmt.Println(int(float64(total) / float64(elaspe.Milliseconds()) * 1000))
// }
func TestC256SqrSpeed(t *testing.T) {
a := []uint64{0x715A4589334C74C7, 0x8FE30BBFF2660BE1, 0x5F9904466A39C994, 0x32C4AE2C1F198119}
res := make([]uint64, 4)
begin := time.Now()
total := 100000000
for i := 0; i < total; i++ {
c256Sqr(res, a, 1)
// c256Sqr(res, res, 1)
// c256Sqr(res, res, 1)
// c256Sqr(res, res, 1)
}
elaspe := time.Since(begin)
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
fmt.Println(int(float64(total) / float64(elaspe.Milliseconds()) * 1000))
}
func TestC256MulSpeed(t *testing.T) {
a := []uint64{0x715A4589334C74C7, 0x8FE30BBFF2660BE1, 0x5F9904466A39C994, 0x32C4AE2C1F198119}
b := []uint64{0x715A4589334C74C6, 0x8FE30BBFF2660BE1, 0x5F9904466A39C994, 0x32C4AE2C1F198119}
res := make([]uint64, 4)
total := 100000000
begin := time.Now()
for i := 0; i < total; i++ {
c256Mul(res, a, b)
}
elaspe := time.Since(begin)
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
fmt.Println(int(float64(total) / float64(elaspe.Milliseconds()) * 1000))
}
func TestC256PointAddAsmSpeed(t *testing.T) {
p1 := pointFromBig(c256.Gx, c256.Gy)
x2, y2 := c256.ScalarMult(c256.Gx, c256.Gy, (new(big.Int).SetInt64(2)).Bytes())
p2 := pointFromBig(x2, y2)
var res [12]uint64
begin := time.Now()
total := 10000000
for i := 0; i < total; i++ {
c256PointAddAsm(res[:], p1, p2)
}
elaspe := time.Since(begin)
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
fmt.Println(int(float64(total) / float64(elaspe.Milliseconds()) * 1000))
}
func TestC256PointDoubleAsmSpeed(t *testing.T) {
p1 := pointFromBig(c256.Gx, c256.Gy)
var res [12]uint64
begin := time.Now()
total := 10000000
for i := 0; i < total; i++ {
c256PointDoubleAsm(res[:], p1)
}
elaspe := time.Since(begin)
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
fmt.Println(int(float64(total) / float64(elaspe.Milliseconds()) * 1000))
}
func TestC256InvSpeed(t *testing.T) {
in := []uint64{34235, 23341, 3444, 55555}
out := make([]uint64, 4)
begin := time.Now()
total := 1000000
for i := 0; i < total; i++ {
c256Inverse(out, in)
}
elaspe := time.Since(begin)
fmt.Println("time: ", elaspe.Milliseconds(), "ms")
fmt.Println(float64(total) / float64(elaspe.Milliseconds()) * 1000)
}