v.AddArg2(v0, c)
return true
}
+ // match: (Select0 (Sub64borrow x y c))
+ // result: (SUB (SUB <typ.UInt64> x y) c)
+ for {
+ if v_0.Op != OpSub64borrow {
+ break
+ }
+ c := v_0.Args[2]
+ x := v_0.Args[0]
+ y := v_0.Args[1]
+ v.reset(OpRISCV64SUB)
+ v0 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.UInt64)
+ v0.AddArg2(x, y)
+ v.AddArg2(v0, c)
+ return true
+ }
// match: (Select0 m:(LoweredMuluhilo x y))
// cond: m.Uses == 1
// result: (MULHU x y)
v.AddArg2(v0, v2)
return true
}
+ // match: (Select1 (Sub64borrow x y c))
+ // result: (OR (SLTU <typ.UInt64> x s:(SUB <typ.UInt64> x y)) (SLTU <typ.UInt64> s (SUB <typ.UInt64> s c)))
+ for {
+ if v_0.Op != OpSub64borrow {
+ break
+ }
+ c := v_0.Args[2]
+ x := v_0.Args[0]
+ y := v_0.Args[1]
+ v.reset(OpRISCV64OR)
+ v0 := b.NewValue0(v.Pos, OpRISCV64SLTU, typ.UInt64)
+ s := b.NewValue0(v.Pos, OpRISCV64SUB, typ.UInt64)
+ s.AddArg2(x, y)
+ v0.AddArg2(x, s)
+ v2 := b.NewValue0(v.Pos, OpRISCV64SLTU, typ.UInt64)
+ v3 := b.NewValue0(v.Pos, OpRISCV64SUB, typ.UInt64)
+ v3.AddArg2(s, c)
+ v2.AddArg2(s, v3)
+ v.AddArg2(v0, v2)
+ return true
+ }
// match: (Select1 m:(LoweredMuluhilo x y))
// cond: m.Uses == 1
// result: (MUL x y)
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
return s.newValue3(ssa.OpSub64borrow, types.NewTuple(types.Types[types.TUINT64], types.Types[types.TUINT64]), args[0], args[1], args[2])
},
- sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X)
- alias("math/bits", "Sub", "math/bits", "Sub64", sys.ArchAMD64, sys.ArchARM64, sys.ArchS390X)
+ sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X, sys.RISCV64)
+ alias("math/bits", "Sub", "math/bits", "Sub64", sys.ArchAMD64, sys.ArchARM64, sys.ArchS390X, sys.ArchRISCV64)
addF("math/bits", "Div64",
func(s *state, n *ir.CallExpr, args []*ssa.Value) *ssa.Value {
// check for divide-by-zero/overflow and panic with appropriate message
// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
// s390x:"SUBE"
+ // riscv64: "SUB","SLTU"
return bits.Sub(x, y, ci)
}
// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
// s390x:"SUBE"
+ // riscv64: "SUB","SLTU"
return bits.Sub(x, 7, ci)
}
// ppc64:"SUBC", -"SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", -"SUBE", "SUBZE", "NEG"
// s390x:"SUBC"
+ // riscv64: "SUB","SLTU"
return bits.Sub(x, y, 0)
}
// ppc64:"SUBC", "SUBE", -"SUBZE", -"NEG"
// ppc64le:"SUBC", "SUBE", -"SUBZE", -"NEG"
// s390x:"SUBE"
+ // riscv64: "SUB",-"SLTU"
r, _ := bits.Sub(x, y, ci)
return r
}
// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
// s390x:"SUBE"
+ // riscv64: "SUB","SLTU"
return bits.Sub64(x, y, ci)
}
// ppc64:"SUBC", "SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", "SUBE", "SUBZE", "NEG"
// s390x:"SUBE"
+ // riscv64: "SUB","SLTU"
return bits.Sub64(x, 7, ci)
}
// ppc64:"SUBC", -"SUBE", "SUBZE", "NEG"
// ppc64le:"SUBC", -"SUBE", "SUBZE", "NEG"
// s390x:"SUBC"
+ // riscv64: "SUB","SLTU"
return bits.Sub64(x, y, 0)
}
// ppc64:"SUBC", "SUBE", -"SUBZE", -"NEG"
// ppc64le:"SUBC", "SUBE", -"SUBZE", -"NEG"
// s390x:"SUBE"
+ // riscv64: "SUB",-"SLTU"
r, _ := bits.Sub64(x, y, ci)
return r
}