// rotates
(RotateLeft8 <t> x (MOVVconst [c])) => (Or8 (Lsh8x64 <t> x (MOVVconst [c&7])) (Rsh8Ux64 <t> x (MOVVconst [-c&7])))
+(RotateLeft8 <t> x y) => (OR <t> (SLLV <t> x (ANDconst <typ.Int64> [7] y)) (SRLV <t> (ZeroExt8to64 x) (ANDconst <typ.Int64> [7] (NEGV <typ.Int64> y))))
(RotateLeft16 <t> x (MOVVconst [c])) => (Or16 (Lsh16x64 <t> x (MOVVconst [c&15])) (Rsh16Ux64 <t> x (MOVVconst [-c&15])))
+(RotateLeft16 <t> x y) => (ROTR <t> (OR <typ.UInt32> (ZeroExt16to32 x) (SLLVconst <t> (ZeroExt16to32 x) [16])) (NEGV <typ.Int64> y))
(RotateLeft32 x y) => (ROTR x (NEGV <y.Type> y))
(RotateLeft64 x y) => (ROTRV x (NEGV <y.Type> y))
return false
}
switch c.arch {
- case "386", "amd64", "arm64", "riscv64":
+ case "386", "amd64", "arm64", "loong64", "riscv64":
return true
- case "arm", "s390x", "ppc64", "ppc64le", "wasm", "loong64":
+ case "arm", "s390x", "ppc64", "ppc64le", "wasm":
return bits >= 32
default:
return false
v.AddArg2(v0, v2)
return true
}
- return false
+ // match: (RotateLeft16 <t> x y)
+ // result: (ROTR <t> (OR <typ.UInt32> (ZeroExt16to32 x) (SLLVconst <t> (ZeroExt16to32 x) [16])) (NEGV <typ.Int64> y))
+ for {
+ t := v.Type
+ x := v_0
+ y := v_1
+ v.reset(OpLOONG64ROTR)
+ v.Type = t
+ v0 := b.NewValue0(v.Pos, OpLOONG64OR, typ.UInt32)
+ v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32)
+ v1.AddArg(x)
+ v2 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, t)
+ v2.AuxInt = int64ToAuxInt(16)
+ v2.AddArg(v1)
+ v0.AddArg2(v1, v2)
+ v3 := b.NewValue0(v.Pos, OpLOONG64NEGV, typ.Int64)
+ v3.AddArg(y)
+ v.AddArg2(v0, v3)
+ return true
+ }
}
func rewriteValueLOONG64_OpRotateLeft32(v *Value) bool {
v_1 := v.Args[1]
v.AddArg2(v0, v2)
return true
}
- return false
+ // match: (RotateLeft8 <t> x y)
+ // result: (OR <t> (SLLV <t> x (ANDconst <typ.Int64> [7] y)) (SRLV <t> (ZeroExt8to64 x) (ANDconst <typ.Int64> [7] (NEGV <typ.Int64> y))))
+ for {
+ t := v.Type
+ x := v_0
+ y := v_1
+ v.reset(OpLOONG64OR)
+ v.Type = t
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLV, t)
+ v1 := b.NewValue0(v.Pos, OpLOONG64ANDconst, typ.Int64)
+ v1.AuxInt = int64ToAuxInt(7)
+ v1.AddArg(y)
+ v0.AddArg2(x, v1)
+ v2 := b.NewValue0(v.Pos, OpLOONG64SRLV, t)
+ v3 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64)
+ v3.AddArg(x)
+ v4 := b.NewValue0(v.Pos, OpLOONG64ANDconst, typ.Int64)
+ v4.AuxInt = int64ToAuxInt(7)
+ v5 := b.NewValue0(v.Pos, OpLOONG64NEGV, typ.Int64)
+ v5.AddArg(y)
+ v4.AddArg(v5)
+ v2.AddArg2(v3, v4)
+ v.AddArg2(v0, v2)
+ return true
+ }
}
func rewriteValueLOONG64_OpRsh16Ux16(v *Value) bool {
v_1 := v.Args[1]
func RotateLeft64(n uint64) uint64 {
// amd64:"ROLQ"
// arm64:"ROR"
+ // loong64:"ROTRV"
// ppc64x:"ROTL"
// riscv64:"RORI"
// s390x:"RISBGZ\t[$]0, [$]63, [$]37, "
// amd64:"ROLL" 386:"ROLL"
// arm:`MOVW\tR[0-9]+@>23`
// arm64:"RORW"
+ // loong64:"ROTR\t"
// ppc64x:"ROTLW"
// riscv64:"RORIW"
// s390x:"RLL"
func RotateLeft16(n uint16, s int) uint16 {
// amd64:"ROLW" 386:"ROLW"
// arm64:"RORW",-"CSEL"
+ // loong64:"ROTR\t","SLLV"
return bits.RotateLeft16(n, s)
}
func RotateLeft8(n uint8, s int) uint8 {
// amd64:"ROLB" 386:"ROLB"
// arm64:"LSL","LSR",-"CSEL"
+ // loong64:"OR","SLLV","SRLV"
return bits.RotateLeft8(n, s)
}
func RotateLeftVariable(n uint, m int) uint {
// amd64:"ROLQ"
// arm64:"ROR"
+ // loong64:"ROTRV"
// ppc64x:"ROTL"
// riscv64:"ROL"
// s390x:"RLLG"
func RotateLeftVariable64(n uint64, m int) uint64 {
// amd64:"ROLQ"
// arm64:"ROR"
+ // loong64:"ROTRV"
// ppc64x:"ROTL"
// riscv64:"ROL"
// s390x:"RLLG"
// arm:`MOVW\tR[0-9]+@>R[0-9]+`
// amd64:"ROLL"
// arm64:"RORW"
+ // loong64:"ROTR\t"
// ppc64x:"ROTLW"
// riscv64:"ROLW"
// s390x:"RLL"