diff --git a/src/cmd/compile/internal/loong64/ssa.go b/src/cmd/compile/internal/loong64/ssa.go index d60aef165c..03d7a1082a 100644 --- a/src/cmd/compile/internal/loong64/ssa.go +++ b/src/cmd/compile/internal/loong64/ssa.go @@ -276,7 +276,6 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { ssa.OpLOONG64ANDconst, ssa.OpLOONG64ORconst, ssa.OpLOONG64XORconst, - ssa.OpLOONG64NORconst, ssa.OpLOONG64SLLconst, ssa.OpLOONG64SLLVconst, ssa.OpLOONG64SRLconst, @@ -293,6 +292,23 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) { p.Reg = v.Args[0].Reg() p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() + + case ssa.OpLOONG64NORconst: + // MOVV $const, Rtmp + // NOR Rtmp, Rarg0, Rout + p := s.Prog(loong64.AMOVV) + p.From.Type = obj.TYPE_CONST + p.From.Offset = v.AuxInt + p.To.Type = obj.TYPE_REG + p.To.Reg = loong64.REGTMP + + p2 := s.Prog(v.Op.Asm()) + p2.From.Type = obj.TYPE_REG + p2.From.Reg = loong64.REGTMP + p2.Reg = v.Args[0].Reg() + p2.To.Type = obj.TYPE_REG + p2.To.Reg = v.Reg() + case ssa.OpLOONG64MOVVconst: r := v.Reg() p := s.Prog(v.Op.Asm()) diff --git a/test/codegen/bits.go b/test/codegen/bits.go index c20e4d6733..95e0ed85e4 100644 --- a/test/codegen/bits.go +++ b/test/codegen/bits.go @@ -335,6 +335,15 @@ func op_orn(x, y uint32) uint32 { return x | ^y } +func op_nor(x int64, a []int64) { + // loong64: "MOVV\t[$]0","NOR\tR" + a[0] = ^(0x1234 | x) + // loong64:"NOR",-"XOR" + a[1] = (-1) ^ x + // loong64: "MOVV\t[$]-55",-"OR",-"NOR" + a[2] = ^(0x12 | 0x34) +} + // check bitsets func bitSetPowerOf2Test(x int) bool { // amd64:"BTL\t[$]3"