// Fold bit reversal into loads.
(BR(W|H) x:(MOV(W|H)Zload [off] {sym} ptr mem)) && x.Uses == 1 => @x.Block (MOV(W|H)BRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
-(BR(W|H) x:(MOV(W|H)Zloadidx ptr idx mem)) && x.Uses == 1 => @x.Block (MOV(W|H)Zreg (MOV(W|H)BRloadidx ptr idx mem))
+(BR(W|H) x:(MOV(W|H)Zloadidx ptr idx mem)) && x.Uses == 1 => @x.Block (MOV(W|H)BRloadidx ptr idx mem)
(BRD x:(MOVDload [off] {sym} ptr mem)) && x.Uses == 1 => @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
(BRD x:(MOVDloadidx ptr idx mem)) && x.Uses == 1 => @x.Block (MOVDBRloadidx ptr idx mem)
// GOPPC64<10 rules.
// These Bswap operations should only be introduced by the memcombine pass in places where they can be folded into loads or stores.
(Bswap(32|16) x:(MOV(W|H)Zload [off] {sym} ptr mem)) => @x.Block (MOV(W|H)BRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
-(Bswap(32|16) x:(MOV(W|H)Zloadidx ptr idx mem)) => @x.Block (MOV(W|H)Zreg (MOV(W|H)BRloadidx ptr idx mem))
+(Bswap(32|16) x:(MOV(W|H)Zloadidx ptr idx mem)) => @x.Block (MOV(W|H)BRloadidx ptr idx mem)
(Bswap64 x:(MOVDload [off] {sym} ptr mem)) => @x.Block (MOVDBRload (MOVDaddr <ptr.Type> [off] {sym} ptr) mem)
(Bswap64 x:(MOVDloadidx ptr idx mem)) => @x.Block (MOVDBRloadidx ptr idx mem)
(MOV(D|W|H)store [off] {sym} ptr (Bswap(64|32|16) val) mem) => (MOV(D|W|H)BRstore (MOVDaddr <ptr.Type> [off] {sym} ptr) val mem)
return true
}
// match: (Bswap16 x:(MOVHZloadidx ptr idx mem))
- // result: @x.Block (MOVHZreg (MOVHBRloadidx ptr idx mem))
+ // result: @x.Block (MOVHBRloadidx ptr idx mem)
for {
x := v_0
if x.Op != OpPPC64MOVHZloadidx {
ptr := x.Args[0]
idx := x.Args[1]
b = x.Block
- v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+ v0 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
v.copyOf(v0)
- v1 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
- v1.AddArg3(ptr, idx, mem)
- v0.AddArg(v1)
+ v0.AddArg3(ptr, idx, mem)
return true
}
return false
return true
}
// match: (Bswap32 x:(MOVWZloadidx ptr idx mem))
- // result: @x.Block (MOVWZreg (MOVWBRloadidx ptr idx mem))
+ // result: @x.Block (MOVWBRloadidx ptr idx mem)
for {
x := v_0
if x.Op != OpPPC64MOVWZloadidx {
ptr := x.Args[0]
idx := x.Args[1]
b = x.Block
- v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64)
+ v0 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
v.copyOf(v0)
- v1 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
- v1.AddArg3(ptr, idx, mem)
- v0.AddArg(v1)
+ v0.AddArg3(ptr, idx, mem)
return true
}
return false
}
// match: (BRH x:(MOVHZloadidx ptr idx mem))
// cond: x.Uses == 1
- // result: @x.Block (MOVHZreg (MOVHBRloadidx ptr idx mem))
+ // result: @x.Block (MOVHBRloadidx ptr idx mem)
for {
x := v_0
if x.Op != OpPPC64MOVHZloadidx {
break
}
b = x.Block
- v0 := b.NewValue0(v.Pos, OpPPC64MOVHZreg, typ.Int64)
+ v0 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
v.copyOf(v0)
- v1 := b.NewValue0(v.Pos, OpPPC64MOVHBRloadidx, typ.Int16)
- v1.AddArg3(ptr, idx, mem)
- v0.AddArg(v1)
+ v0.AddArg3(ptr, idx, mem)
return true
}
return false
}
// match: (BRW x:(MOVWZloadidx ptr idx mem))
// cond: x.Uses == 1
- // result: @x.Block (MOVWZreg (MOVWBRloadidx ptr idx mem))
+ // result: @x.Block (MOVWBRloadidx ptr idx mem)
for {
x := v_0
if x.Op != OpPPC64MOVWZloadidx {
break
}
b = x.Block
- v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64)
+ v0 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
v.copyOf(v0)
- v1 := b.NewValue0(v.Pos, OpPPC64MOVWBRloadidx, typ.Int32)
- v1.AddArg3(ptr, idx, mem)
- v0.AddArg(v1)
+ v0.AddArg3(ptr, idx, mem)
return true
}
return false