mirror of
https://github.com/golang/go
synced 2024-09-29 22:34:33 -06:00
cmd/compile/internal/ssagen: enable intrinsic operation on loong64
Contributors to the loong64 port are: Weining Lu <luweining@loongson.cn> Lei Wang <wanglei@loongson.cn> Lingqin Gong <gonglingqin@loongson.cn> Xiaolin Zhao <zhaoxiaolin@loongson.cn> Meidan Li <limeidan@loongson.cn> Xiaojuan Zhai <zhaixiaojuan@loongson.cn> Qiyuan Pu <puqiyuan@loongson.cn> Guoqi Chen <chenguoqi@loongson.cn> This port has been updated to Go 1.15.6: https://github.com/loongson/go Updates #46229 Change-Id: If28fe03297e1de62f348373f2779dce07f54611c Reviewed-on: https://go-review.googlesource.com/c/go/+/367042 Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
756fcd8fc2
commit
900ae5b35a
@ -3920,7 +3920,7 @@ func InitTables() {
|
|||||||
}
|
}
|
||||||
return s.newValue2(ssa.OpMul64uover, types.NewTuple(types.Types[types.TUINT], types.Types[types.TUINT]), args[0], args[1])
|
return s.newValue2(ssa.OpMul64uover, types.NewTuple(types.Types[types.TUINT], types.Types[types.TUINT]), args[0], args[1])
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.I386, sys.MIPS64, sys.RISCV64)
|
sys.AMD64, sys.I386, sys.Loong64, sys.MIPS64, sys.RISCV64)
|
||||||
alias("runtime", "mulUintptr", "runtime/internal/math", "MulUintptr", all...)
|
alias("runtime", "mulUintptr", "runtime/internal/math", "MulUintptr", all...)
|
||||||
add("runtime", "KeepAlive",
|
add("runtime", "KeepAlive",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
@ -3998,21 +3998,21 @@ func InitTables() {
|
|||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Load8",
|
addF("runtime/internal/atomic", "Load8",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue2(ssa.OpAtomicLoad8, types.NewTuple(types.Types[types.TUINT8], types.TypeMem), args[0], s.mem())
|
v := s.newValue2(ssa.OpAtomicLoad8, types.NewTuple(types.Types[types.TUINT8], types.TypeMem), args[0], s.mem())
|
||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT8], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT8], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Load64",
|
addF("runtime/internal/atomic", "Load64",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue2(ssa.OpAtomicLoad64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], s.mem())
|
v := s.newValue2(ssa.OpAtomicLoad64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], s.mem())
|
||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "LoadAcq",
|
addF("runtime/internal/atomic", "LoadAcq",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue2(ssa.OpAtomicLoadAcq32, types.NewTuple(types.Types[types.TUINT32], types.TypeMem), args[0], s.mem())
|
v := s.newValue2(ssa.OpAtomicLoadAcq32, types.NewTuple(types.Types[types.TUINT32], types.TypeMem), args[0], s.mem())
|
||||||
@ -4033,32 +4033,32 @@ func InitTables() {
|
|||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, s.f.Config.Types.BytePtr, v)
|
return s.newValue1(ssa.OpSelect0, s.f.Config.Types.BytePtr, v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
|
|
||||||
addF("runtime/internal/atomic", "Store",
|
addF("runtime/internal/atomic", "Store",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore32, types.TypeMem, args[0], args[1], s.mem())
|
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore32, types.TypeMem, args[0], args[1], s.mem())
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Store8",
|
addF("runtime/internal/atomic", "Store8",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore8, types.TypeMem, args[0], args[1], s.mem())
|
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore8, types.TypeMem, args[0], args[1], s.mem())
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Store64",
|
addF("runtime/internal/atomic", "Store64",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore64, types.TypeMem, args[0], args[1], s.mem())
|
s.vars[memVar] = s.newValue3(ssa.OpAtomicStore64, types.TypeMem, args[0], args[1], s.mem())
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "StorepNoWB",
|
addF("runtime/internal/atomic", "StorepNoWB",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
s.vars[memVar] = s.newValue3(ssa.OpAtomicStorePtrNoWB, types.TypeMem, args[0], args[1], s.mem())
|
s.vars[memVar] = s.newValue3(ssa.OpAtomicStorePtrNoWB, types.TypeMem, args[0], args[1], s.mem())
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "StoreRel",
|
addF("runtime/internal/atomic", "StoreRel",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
s.vars[memVar] = s.newValue3(ssa.OpAtomicStoreRel32, types.TypeMem, args[0], args[1], s.mem())
|
s.vars[memVar] = s.newValue3(ssa.OpAtomicStoreRel32, types.TypeMem, args[0], args[1], s.mem())
|
||||||
@ -4078,14 +4078,14 @@ func InitTables() {
|
|||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Xchg64",
|
addF("runtime/internal/atomic", "Xchg64",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue3(ssa.OpAtomicExchange64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], args[1], s.mem())
|
v := s.newValue3(ssa.OpAtomicExchange64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], args[1], s.mem())
|
||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
|
|
||||||
type atomicOpEmitter func(s *state, n *ir.CallExpr, args []*ssa.Value, op ssa.Op, typ types.Kind)
|
type atomicOpEmitter func(s *state, n *ir.CallExpr, args []*ssa.Value, op ssa.Op, typ types.Kind)
|
||||||
|
|
||||||
@ -4143,14 +4143,14 @@ func InitTables() {
|
|||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT32], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Xadd64",
|
addF("runtime/internal/atomic", "Xadd64",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue3(ssa.OpAtomicAdd64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], args[1], s.mem())
|
v := s.newValue3(ssa.OpAtomicAdd64, types.NewTuple(types.Types[types.TUINT64], types.TypeMem), args[0], args[1], s.mem())
|
||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TUINT64], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
|
|
||||||
addF("runtime/internal/atomic", "Xadd",
|
addF("runtime/internal/atomic", "Xadd",
|
||||||
makeAtomicGuardedIntrinsicARM64(ssa.OpAtomicAdd32, ssa.OpAtomicAdd32Variant, types.TUINT32, types.TUINT32, atomicXchgXaddEmitterARM64),
|
makeAtomicGuardedIntrinsicARM64(ssa.OpAtomicAdd32, ssa.OpAtomicAdd32Variant, types.TUINT32, types.TUINT32, atomicXchgXaddEmitterARM64),
|
||||||
@ -4165,14 +4165,14 @@ func InitTables() {
|
|||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TBOOL], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TBOOL], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "Cas64",
|
addF("runtime/internal/atomic", "Cas64",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue4(ssa.OpAtomicCompareAndSwap64, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem())
|
v := s.newValue4(ssa.OpAtomicCompareAndSwap64, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem())
|
||||||
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
s.vars[memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
|
||||||
return s.newValue1(ssa.OpSelect0, types.Types[types.TBOOL], v)
|
return s.newValue1(ssa.OpSelect0, types.Types[types.TBOOL], v)
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
sys.AMD64, sys.Loong64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
|
||||||
addF("runtime/internal/atomic", "CasRel",
|
addF("runtime/internal/atomic", "CasRel",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
v := s.newValue4(ssa.OpAtomicCompareAndSwap32, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem())
|
v := s.newValue4(ssa.OpAtomicCompareAndSwap32, types.NewTuple(types.Types[types.TBOOL], types.TypeMem), args[0], args[1], args[2], s.mem())
|
||||||
@ -4288,7 +4288,7 @@ func InitTables() {
|
|||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
return s.newValue1(ssa.OpSqrt, types.Types[types.TFLOAT64], args[0])
|
return s.newValue1(ssa.OpSqrt, types.Types[types.TFLOAT64], args[0])
|
||||||
},
|
},
|
||||||
sys.I386, sys.AMD64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X, sys.Wasm)
|
sys.I386, sys.AMD64, sys.ARM, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X, sys.Wasm)
|
||||||
addF("math", "Trunc",
|
addF("math", "Trunc",
|
||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
return s.newValue1(ssa.OpTrunc, types.Types[types.TFLOAT64], args[0])
|
return s.newValue1(ssa.OpTrunc, types.Types[types.TFLOAT64], args[0])
|
||||||
@ -4675,7 +4675,7 @@ func InitTables() {
|
|||||||
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
|
||||||
return s.newValue2(ssa.OpMul64uhilo, types.NewTuple(types.Types[types.TUINT64], types.Types[types.TUINT64]), args[0], args[1])
|
return s.newValue2(ssa.OpMul64uhilo, types.NewTuple(types.Types[types.TUINT64], types.Types[types.TUINT64]), args[0], args[1])
|
||||||
},
|
},
|
||||||
sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X, sys.MIPS64, sys.RISCV64)
|
sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X, sys.MIPS64, sys.RISCV64, sys.Loong64)
|
||||||
alias("math/bits", "Mul", "math/bits", "Mul64", p8...)
|
alias("math/bits", "Mul", "math/bits", "Mul64", p8...)
|
||||||
alias("runtime/internal/math", "Mul64", "math/bits", "Mul64", p8...)
|
alias("runtime/internal/math", "Mul64", "math/bits", "Mul64", p8...)
|
||||||
addF("math/bits", "Add64",
|
addF("math/bits", "Add64",
|
||||||
@ -7615,7 +7615,7 @@ func (s *State) Call(v *ssa.Value) *obj.Prog {
|
|||||||
switch Arch.LinkArch.Family {
|
switch Arch.LinkArch.Family {
|
||||||
case sys.AMD64, sys.I386, sys.PPC64, sys.RISCV64, sys.S390X, sys.Wasm:
|
case sys.AMD64, sys.I386, sys.PPC64, sys.RISCV64, sys.S390X, sys.Wasm:
|
||||||
p.To.Type = obj.TYPE_REG
|
p.To.Type = obj.TYPE_REG
|
||||||
case sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64:
|
case sys.ARM, sys.ARM64, sys.Loong64, sys.MIPS, sys.MIPS64:
|
||||||
p.To.Type = obj.TYPE_MEM
|
p.To.Type = obj.TYPE_MEM
|
||||||
default:
|
default:
|
||||||
base.Fatalf("unknown indirect call family")
|
base.Fatalf("unknown indirect call family")
|
||||||
|
Loading…
Reference in New Issue
Block a user