// Copyright 2020 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . //go:build (amd64 && blsasm) || (amd64 && blsadx) // +build amd64,blsasm amd64,blsadx package bls12381 import ( "golang.org/x/sys/cpu" ) func init() { if !enableADX || !cpu.X86.HasADX || !cpu.X86.HasBMI2 { mul = mulNoADX } } // Use ADX backend for default var mul func(c, a, b *fe) = mulADX func square(c, a *fe) { mul(c, a, a) } func neg(c, a *fe) { if a.isZero() { c.set(a) } else { _neg(c, a) } } //go:noescape func add(c, a, b *fe) //go:noescape func addAssign(a, b *fe) //go:noescape func ladd(c, a, b *fe) //go:noescape func laddAssign(a, b *fe) //go:noescape func double(c, a *fe) //go:noescape func doubleAssign(a *fe) //go:noescape func ldouble(c, a *fe) //go:noescape func sub(c, a, b *fe) //go:noescape func subAssign(a, b *fe) //go:noescape func lsubAssign(a, b *fe) //go:noescape func _neg(c, a *fe) //go:noescape func mulNoADX(c, a, b *fe) //go:noescape func mulADX(c, a, b *fe)