(MOVWstore [off] {sym} ptr (MOVWUreg x) mem) => (MOVWstore [off] {sym} ptr x mem)
// register indexed load
-(MOVVload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVVloadidx ptr idx mem)
-(MOVWUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVWUloadidx ptr idx mem)
-(MOVWload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVWloadidx ptr idx mem)
-(MOVHUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVHUloadidx ptr idx mem)
-(MOVHload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVHloadidx ptr idx mem)
-(MOVBUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVBUloadidx ptr idx mem)
-(MOVBload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVBloadidx ptr idx mem)
-(MOVFload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVFloadidx ptr idx mem)
-(MOVDload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVDloadidx ptr idx mem)
+(MOVVload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVVloadidx ptr idx mem)
+(MOVVload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVVloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVWUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVWUloadidx ptr idx mem)
+(MOVWUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVWUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVWload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVWloadidx ptr idx mem)
+(MOVWload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVWloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVHUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVHUloadidx ptr idx mem)
+(MOVHUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVHUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVHload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVHloadidx ptr idx mem)
+(MOVHload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVHloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVBUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVBUloadidx ptr idx mem)
+(MOVBUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVBUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVBload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVBloadidx ptr idx mem)
+(MOVBload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVBloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVFload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVFloadidx ptr idx mem)
+(MOVFload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVFloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+(MOVDload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVDloadidx ptr idx mem)
+(MOVDload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem) && off == 0 && sym == nil => (MOVDloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
(MOVVloadidx ptr (MOVVconst [c]) mem) && is32Bit(c) => (MOVVload [int32(c)] ptr mem)
(MOVVloadidx (MOVVconst [c]) ptr mem) && is32Bit(c) => (MOVVload [int32(c)] ptr mem)
(MOVWUloadidx ptr (MOVVconst [c]) mem) && is32Bit(c) => (MOVWUload [int32(c)] ptr mem)
(MOVDloadidx (MOVVconst [c]) ptr mem) && is32Bit(c) => (MOVDload [int32(c)] ptr mem)
// register indexed store
-(MOVVstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVVstoreidx ptr idx val mem)
-(MOVWstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx ptr idx val mem)
-(MOVHstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx ptr idx val mem)
-(MOVBstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVBstoreidx ptr idx val mem)
-(MOVFstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVFstoreidx ptr idx val mem)
-(MOVDstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx ptr idx val mem)
+(MOVVstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVVstoreidx ptr idx val mem)
+(MOVVstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVVstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+(MOVWstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx ptr idx val mem)
+(MOVWstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVWstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+(MOVHstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx ptr idx val mem)
+(MOVHstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVHstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+(MOVBstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVBstoreidx ptr idx val mem)
+(MOVBstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVBstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+(MOVFstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVFstoreidx ptr idx val mem)
+(MOVFstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVFstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+(MOVDstore [off] {sym} (ADDV ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx ptr idx val mem)
+(MOVDstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem) && off == 0 && sym == nil => (MOVDstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
(MOVVstoreidx ptr (MOVVconst [c]) val mem) && is32Bit(c) => (MOVVstore [int32(c)] ptr val mem)
(MOVVstoreidx (MOVVconst [c]) idx val mem) && is32Bit(c) => (MOVVstore [int32(c)] idx val mem)
(MOVWstoreidx ptr (MOVVconst [c]) val mem) && is32Bit(c) => (MOVWstore [int32(c)] ptr val mem)
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVBUload [off] {sym} ptr (MOVBstore [off] {sym} ptr x _))
// result: (MOVBUreg x)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVBUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVBUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVBUloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVBUload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(read8(sym, int64(off)))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVBload [off] {sym} ptr (MOVBstore [off] {sym} ptr x _))
// result: (MOVBreg x)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVBload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVBloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVBloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVBload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(int8(read8(sym, int64(off))))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
// result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem)
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVBstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVBstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVBstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVBstoreidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVDload [off] {sym} ptr (MOVVstore [off] {sym} ptr val _))
// result: (MOVVgpfp val)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVDload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVDloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVDloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVDloadidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVDstore [off] {sym} ptr (MOVVgpfp val) mem)
// result: (MOVVstore [off] {sym} ptr val mem)
for {
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVDstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVDstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVDstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVDstoreidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVFload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _))
// result: (MOVWgpfp val)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVFload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVFloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVFloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVFloadidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVFstore [off] {sym} ptr (MOVWgpfp val) mem)
// result: (MOVWstore [off] {sym} ptr val mem)
for {
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVFstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVFstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVFstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVFstoreidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVHUload [off] {sym} ptr (MOVHstore [off] {sym} ptr x _))
// result: (MOVHUreg x)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVHUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVHUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVHUloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVHUload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVHload [off] {sym} ptr (MOVHstore [off] {sym} ptr x _))
// result: (MOVHreg x)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVHload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVHloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVHloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVHload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(int16(read16(sym, int64(off), config.ctxt.Arch.ByteOrder)))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem)
// cond: is32Bit(int64(off1)+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_dynlink)
// result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem)
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVHstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVHstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVHstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVHstoreidx(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVVload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _))
// result: (MOVVfpgp val)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVVload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVVloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVVloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVVload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVVstore [off] {sym} ptr (MOVVfpgp val) mem)
// result: (MOVDstore [off] {sym} ptr val mem)
for {
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVVstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVVstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVVstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVVstoreidx(v *Value) bool {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVWUload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVWUloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVWUloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVWUload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVWload [off] {sym} ptr (MOVWstore [off] {sym} ptr x _))
// result: (MOVWreg x)
for {
v.AddArg3(ptr, idx, mem)
return true
}
+ // match: (MOVWload [off] {sym} (ADDshiftLLV [shift] ptr idx) mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVWloadidx ptr (SLLVconst <typ.Int64> [shift] idx) mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ mem := v_1
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVWloadidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg3(ptr, v0, mem)
+ return true
+ }
// match: (MOVWload [off] {sym} (SB) _)
// cond: symIsRO(sym)
// result: (MOVVconst [int64(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder)))])
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
+ typ := &b.Func.Config.Types
// match: (MOVWstore [off] {sym} ptr (MOVWfpgp val) mem)
// result: (MOVFstore [off] {sym} ptr val mem)
for {
v.AddArg4(ptr, idx, val, mem)
return true
}
+ // match: (MOVWstore [off] {sym} (ADDshiftLLV [shift] ptr idx) val mem)
+ // cond: off == 0 && sym == nil
+ // result: (MOVWstoreidx ptr (SLLVconst <typ.Int64> [shift] idx) val mem)
+ for {
+ off := auxIntToInt32(v.AuxInt)
+ sym := auxToSym(v.Aux)
+ if v_0.Op != OpLOONG64ADDshiftLLV {
+ break
+ }
+ shift := auxIntToInt64(v_0.AuxInt)
+ idx := v_0.Args[1]
+ ptr := v_0.Args[0]
+ val := v_1
+ mem := v_2
+ if !(off == 0 && sym == nil) {
+ break
+ }
+ v.reset(OpLOONG64MOVWstoreidx)
+ v0 := b.NewValue0(v.Pos, OpLOONG64SLLVconst, typ.Int64)
+ v0.AuxInt = int64ToAuxInt(shift)
+ v0.AddArg(idx)
+ v.AddArg4(ptr, v0, val, mem)
+ return true
+ }
return false
}
func rewriteValueLOONG64_OpLOONG64MOVWstoreidx(v *Value) bool {