Because of the index, these ops can't guarantee faulting if arg0 is nil.
Clean up the PPC64 index ops - they can't take a sym or an offset.
Noticed while debugging #37881. I don't think it is the cause, but I guess
there is a chance.
Update #37881
Change-Id: Ic22925250bf7b1ba64e3cea1a65638bc4bab390c
Reviewed-on: https://go-review.googlesource.com/c/go/+/224457
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
p.From.Type = obj.TYPE_MEM
p.From.Reg = v.Args[0].Reg()
p.From.Index = v.Args[1].Reg()
- gc.AddAux(&p.From, v)
p.To.Type = obj.TYPE_REG
p.To.Reg = v.Reg()
p.To.Index = v.Args[1].Reg()
p.To.Type = obj.TYPE_MEM
p.To.Reg = v.Args[0].Reg()
- gc.AddAux(&p.To, v)
case ssa.OpPPC64ISEL, ssa.OpPPC64ISELB:
// ISEL, ISELB
{name: "XORLload", argLength: 3, reg: gp21load, asm: "XORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 ^ tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
// binary-op with an indexed memory source operand
- {name: "ADDLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ADDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 + tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
- {name: "SUBLloadidx4", argLength: 4, reg: gp21loadidx, asm: "SUBL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 - tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
- {name: "MULLloadidx4", argLength: 4, reg: gp21loadidx, asm: "IMULL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 * tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
- {name: "ANDLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ANDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 & tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
- {name: "ORLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 | tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
- {name: "XORLloadidx4", argLength: 4, reg: gp21loadidx, asm: "XORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 ^ tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "ADDLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ADDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 + tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "SUBLloadidx4", argLength: 4, reg: gp21loadidx, asm: "SUBL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 - tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "MULLloadidx4", argLength: 4, reg: gp21loadidx, asm: "IMULL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 * tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "ANDLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ANDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 & tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "ORLloadidx4", argLength: 4, reg: gp21loadidx, asm: "ORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 | tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
+ {name: "XORLloadidx4", argLength: 4, reg: gp21loadidx, asm: "XORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, symEffect: "Read"}, // arg0 ^ tmp, tmp loaded from arg1+arg2*4+auxint+aux, arg3 = mem
// unary ops
{name: "NEGL", argLength: 1, reg: gp11, asm: "NEGL", resultInArg0: true, clobberFlags: true}, // -arg0
{name: "XORLmodify", argLength: 3, reg: gpstore, asm: "XORL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+auxint+aux) ^= arg1, arg2=mem
// direct binary-op on indexed memory (read-modify-write)
- {name: "ADDLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ADDL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) += arg2, arg3=mem
- {name: "SUBLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "SUBL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) -= arg2, arg3=mem
- {name: "ANDLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ANDL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) &= arg2, arg3=mem
- {name: "ORLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ORL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) |= arg2, arg3=mem
- {name: "XORLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "XORL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) ^= arg2, arg3=mem
+ {name: "ADDLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ADDL", aux: "SymOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) += arg2, arg3=mem
+ {name: "SUBLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "SUBL", aux: "SymOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) -= arg2, arg3=mem
+ {name: "ANDLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ANDL", aux: "SymOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) &= arg2, arg3=mem
+ {name: "ORLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "ORL", aux: "SymOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) |= arg2, arg3=mem
+ {name: "XORLmodifyidx4", argLength: 4, reg: gpstoreidx, asm: "XORL", aux: "SymOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // *(arg0+arg1*4+auxint+aux) ^= arg2, arg3=mem
// direct binary-op on memory with a constant (read-modify-write)
{name: "ADDLconstmodify", argLength: 2, reg: gpstoreconst, asm: "ADDL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // add ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux, arg1=mem
{name: "XORLconstmodify", argLength: 2, reg: gpstoreconst, asm: "XORL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // xor ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux, arg1=mem
// direct binary-op on indexed memory with a constant (read-modify-write)
- {name: "ADDLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ADDL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // add ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
- {name: "ANDLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ANDL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // and ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
- {name: "ORLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ORL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // or ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
- {name: "XORLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "XORL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // xor ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
+ {name: "ADDLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ADDL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // add ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
+ {name: "ANDLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ANDL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // and ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
+ {name: "ORLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "ORL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // or ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
+ {name: "XORLconstmodifyidx4", argLength: 3, reg: gpstoreconstidx, asm: "XORL", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, symEffect: "Read,Write"}, // xor ValAndOff(AuxInt).Val() to arg0+arg1*4+ValAndOff(AuxInt).Off()+aux, arg2=mem
// indexed loads/stores
{name: "MOVBloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVBLZX", aux: "SymOff", symEffect: "Read"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem
(MOVBstorezero [off1+off2] {sym} x mem)
// Stores with addressing that can be done as indexed stores
-(MOV(D|W|H|B)store [off] {sym} p:(ADD ptr idx) val mem) && off == 0 && sym == nil && p.Uses == 1 -> (MOV(D|W|H|B)storeidx ptr idx val mem)
+(MOV(D|W|H|B)store [0] {sym} p:(ADD ptr idx) val mem) && sym == nil && p.Uses == 1 -> (MOV(D|W|H|B)storeidx ptr idx val mem)
// Stores with constant index values can be done without indexed instructions
(MOVDstoreidx ptr (MOVDconst [c]) val mem) && is16Bit(c) && c%4 == 0 -> (MOVDstore [c] ptr val mem)
(MOVWstore [off] {sym} ptr (MOV(W|WZ)reg x) mem) -> (MOVWstore [off] {sym} ptr x mem)
(MOVBstore [off] {sym} ptr (SRWconst (MOV(H|HZ)reg x) [c]) mem) && c <= 8 -> (MOVBstore [off] {sym} ptr (SRWconst <typ.UInt32> x [c]) mem)
(MOVBstore [off] {sym} ptr (SRWconst (MOV(W|WZ)reg x) [c]) mem) && c <= 24 -> (MOVBstore [off] {sym} ptr (SRWconst <typ.UInt32> x [c]) mem)
-(MOVBstoreidx [off] {sym} ptr idx (MOV(B|BZ|H|HZ|W|WZ)reg x) mem) -> (MOVBstoreidx [off] {sym} ptr idx x mem)
-(MOVHstoreidx [off] {sym} ptr idx (MOV(H|HZ|W|WZ)reg x) mem) -> (MOVHstoreidx [off] {sym} ptr idx x mem)
-(MOVWstoreidx [off] {sym} ptr idx (MOV(W|WZ)reg x) mem) -> (MOVWstoreidx [off] {sym} ptr idx x mem)
-(MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOV(H|HZ)reg x) [c]) mem) && c <= 8 -> (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
-(MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOV(W|WZ)reg x) [c]) mem) && c <= 24 -> (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+(MOVBstoreidx ptr idx (MOV(B|BZ|H|HZ|W|WZ)reg x) mem) -> (MOVBstoreidx ptr idx x mem)
+(MOVHstoreidx ptr idx (MOV(H|HZ|W|WZ)reg x) mem) -> (MOVHstoreidx ptr idx x mem)
+(MOVWstoreidx ptr idx (MOV(W|WZ)reg x) mem) -> (MOVWstoreidx ptr idx x mem)
+(MOVBstoreidx ptr idx (SRWconst (MOV(H|HZ)reg x) [c]) mem) && c <= 8 -> (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+(MOVBstoreidx ptr idx (SRWconst (MOV(W|WZ)reg x) [c]) mem) && c <= 24 -> (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
(MOVHBRstore {sym} ptr (MOV(H|HZ|W|WZ)reg x) mem) -> (MOVHBRstore {sym} ptr x mem)
(MOVWBRstore {sym} ptr (MOV(W|WZ)reg x) mem) -> (MOVWBRstore {sym} ptr x mem)
{name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes zero extend reverse order
// In these cases an index register is used in addition to a base register
- {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"}, // zero extend uint8 to uint64
- {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"}, // sign extend int16 to int64
- {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // zero extend uint16 to uint64
- {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"}, // sign extend int32 to int64
- {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"}, // zero extend uint32 to uint64
- {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
- {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"}, // sign extend int16 to int64
- {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"}, // sign extend int32 to int64
- {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
- {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
- {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
+ // Loads from memory location arg[0] + arg[1].
+ {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", typ: "UInt8"}, // zero extend uint8 to uint64
+ {name: "MOVHloadidx", argLength: 3, reg: gploadidx, asm: "MOVH", typ: "Int16"}, // sign extend int16 to int64
+ {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", typ: "UInt16"}, // zero extend uint16 to uint64
+ {name: "MOVWloadidx", argLength: 3, reg: gploadidx, asm: "MOVW", typ: "Int32"}, // sign extend int32 to int64
+ {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", typ: "UInt32"}, // zero extend uint32 to uint64
+ {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", typ: "Int64"},
+ {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", typ: "Int16"}, // sign extend int16 to int64
+ {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", typ: "Int32"}, // sign extend int32 to int64
+ {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", typ: "Int64"},
+ {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", typ: "Float64"},
+ {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", typ: "Float32"},
// Store bytes in the reverse endian order of the arch into arg0.
// These are indexed stores with no offset field in the instruction so the auxint fields are not used.
{name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store single float
// Stores using index and base registers
- {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store bye
- {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store half word
- {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store word
- {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store double word
- {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store double float
- {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store single float
- {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store half word reversed byte using index reg
- {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store word reversed byte using index reg
- {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store double word reversed byte using index reg
+ // Stores to arg[0] + arg[1]
+ {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", typ: "Mem"}, // store bye
+ {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", typ: "Mem"}, // store half word
+ {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", typ: "Mem"}, // store word
+ {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", typ: "Mem"}, // store double word
+ {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", typ: "Mem"}, // store double float
+ {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", typ: "Mem"}, // store single float
+ {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", typ: "Mem"}, // store half word reversed byte using index reg
+ {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", typ: "Mem"}, // store word reversed byte using index reg
+ {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", typ: "Mem"}, // store double word reversed byte using index reg
// The following ops store 0 into arg0+aux+auxint arg1=mem
{name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store zero 1 byte
},
},
{
- name: "ADDLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.AADDL,
+ name: "ADDLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.AADDL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "SUBLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.ASUBL,
+ name: "SUBLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.ASUBL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "MULLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.AIMULL,
+ name: "MULLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.AIMULL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "ANDLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.AANDL,
+ name: "ANDLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.AANDL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "ORLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.AORL,
+ name: "ORLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.AORL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "XORLloadidx4",
- auxType: auxSymOff,
- argLen: 4,
- resultInArg0: true,
- clobberFlags: true,
- faultOnNilArg1: true,
- symEffect: SymRead,
- asm: x86.AXORL,
+ name: "XORLloadidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ resultInArg0: true,
+ clobberFlags: true,
+ symEffect: SymRead,
+ asm: x86.AXORL,
reg: regInfo{
inputs: []inputInfo{
{0, 239}, // AX CX DX BX BP SI DI
},
},
{
- name: "ADDLmodifyidx4",
- auxType: auxSymOff,
- argLen: 4,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AADDL,
+ name: "ADDLmodifyidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AADDL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "SUBLmodifyidx4",
- auxType: auxSymOff,
- argLen: 4,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.ASUBL,
+ name: "SUBLmodifyidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.ASUBL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "ANDLmodifyidx4",
- auxType: auxSymOff,
- argLen: 4,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AANDL,
+ name: "ANDLmodifyidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AANDL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "ORLmodifyidx4",
- auxType: auxSymOff,
- argLen: 4,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AORL,
+ name: "ORLmodifyidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AORL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "XORLmodifyidx4",
- auxType: auxSymOff,
- argLen: 4,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AXORL,
+ name: "XORLmodifyidx4",
+ auxType: auxSymOff,
+ argLen: 4,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AXORL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "ADDLconstmodifyidx4",
- auxType: auxSymValAndOff,
- argLen: 3,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AADDL,
+ name: "ADDLconstmodifyidx4",
+ auxType: auxSymValAndOff,
+ argLen: 3,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AADDL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "ANDLconstmodifyidx4",
- auxType: auxSymValAndOff,
- argLen: 3,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AANDL,
+ name: "ANDLconstmodifyidx4",
+ auxType: auxSymValAndOff,
+ argLen: 3,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AANDL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "ORLconstmodifyidx4",
- auxType: auxSymValAndOff,
- argLen: 3,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AORL,
+ name: "ORLconstmodifyidx4",
+ auxType: auxSymValAndOff,
+ argLen: 3,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AORL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "XORLconstmodifyidx4",
- auxType: auxSymValAndOff,
- argLen: 3,
- clobberFlags: true,
- faultOnNilArg0: true,
- symEffect: SymRead | SymWrite,
- asm: x86.AXORL,
+ name: "XORLconstmodifyidx4",
+ auxType: auxSymValAndOff,
+ argLen: 3,
+ clobberFlags: true,
+ symEffect: SymRead | SymWrite,
+ asm: x86.AXORL,
reg: regInfo{
inputs: []inputInfo{
{1, 255}, // AX CX DX BX SP BP SI DI
},
},
{
- name: "MOVBZloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVBZ,
+ name: "MOVBZloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVBZ,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVHloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVH,
+ name: "MOVHloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVH,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVHZloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVHZ,
+ name: "MOVHZloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVHZ,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVWloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVW,
+ name: "MOVWloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVW,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVWZloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVWZ,
+ name: "MOVWZloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVWZ,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVDloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVD,
+ name: "MOVDloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVD,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVHBRloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVHBR,
+ name: "MOVHBRloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVHBR,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVWBRloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVWBR,
+ name: "MOVWBRloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVWBR,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVDBRloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AMOVDBR,
+ name: "MOVDBRloadidx",
+ argLen: 3,
+ asm: ppc64.AMOVDBR,
reg: regInfo{
inputs: []inputInfo{
{1, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "FMOVDloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AFMOVD,
+ name: "FMOVDloadidx",
+ argLen: 3,
+ asm: ppc64.AFMOVD,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "FMOVSloadidx",
- auxType: auxSymOff,
- argLen: 3,
- faultOnNilArg0: true,
- symEffect: SymRead,
- asm: ppc64.AFMOVS,
+ name: "FMOVSloadidx",
+ argLen: 3,
+ asm: ppc64.AFMOVS,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVBstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVB,
+ name: "MOVBstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVB,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVHstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVH,
+ name: "MOVHstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVH,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVWstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVW,
+ name: "MOVWstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVW,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVDstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVD,
+ name: "MOVDstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVD,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "FMOVDstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AFMOVD,
+ name: "FMOVDstoreidx",
+ argLen: 4,
+ asm: ppc64.AFMOVD,
reg: regInfo{
inputs: []inputInfo{
{2, 576460743713488896}, // F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
},
},
{
- name: "FMOVSstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AFMOVS,
+ name: "FMOVSstoreidx",
+ argLen: 4,
+ asm: ppc64.AFMOVS,
reg: regInfo{
inputs: []inputInfo{
{2, 576460743713488896}, // F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26
},
},
{
- name: "MOVHBRstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVHBR,
+ name: "MOVHBRstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVHBR,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVWBRstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVWBR,
+ name: "MOVWBRstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVWBR,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
},
},
{
- name: "MOVDBRstoreidx",
- auxType: auxSymOff,
- argLen: 4,
- faultOnNilArg0: true,
- symEffect: SymWrite,
- asm: ppc64.AMOVDBR,
+ name: "MOVDBRstoreidx",
+ argLen: 4,
+ asm: ppc64.AMOVDBR,
reg: regInfo{
inputs: []inputInfo{
{0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
v.AddArg2(ptr, mem)
return true
}
- // match: (MOVBstore [off] {sym} p:(ADD ptr idx) val mem)
- // cond: off == 0 && sym == nil && p.Uses == 1
+ // match: (MOVBstore [0] {sym} p:(ADD ptr idx) val mem)
+ // cond: sym == nil && p.Uses == 1
// result: (MOVBstoreidx ptr idx val mem)
for {
- off := v.AuxInt
+ if v.AuxInt != 0 {
+ break
+ }
sym := v.Aux
p := v_0
if p.Op != OpPPC64ADD {
ptr := p.Args[0]
val := v_1
mem := v_2
- if !(off == 0 && sym == nil && p.Uses == 1) {
+ if !(sym == nil && p.Uses == 1) {
break
}
v.reset(OpPPC64MOVBstoreidx)
v.AddArg3(ptr, val, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVBreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVBreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVBreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVBZreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVBZreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVBZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVHreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVHreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVHreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVHZreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVHZreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVHZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVWreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVWreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (MOVWZreg x) mem)
- // result: (MOVBstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVBstoreidx ptr idx (MOVWZreg x) mem)
+ // result: (MOVBstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOVHreg x) [c]) mem)
+ // match: (MOVBstoreidx ptr idx (SRWconst (MOVHreg x) [c]) mem)
// cond: c <= 8
- // result: (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+ // result: (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64SRWconst {
break
}
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v0 := b.NewValue0(v.Pos, OpPPC64SRWconst, typ.UInt32)
v0.AuxInt = c
v0.AddArg(x)
v.AddArg4(ptr, idx, v0, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOVHZreg x) [c]) mem)
+ // match: (MOVBstoreidx ptr idx (SRWconst (MOVHZreg x) [c]) mem)
// cond: c <= 8
- // result: (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+ // result: (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64SRWconst {
break
}
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v0 := b.NewValue0(v.Pos, OpPPC64SRWconst, typ.UInt32)
v0.AuxInt = c
v0.AddArg(x)
v.AddArg4(ptr, idx, v0, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOVWreg x) [c]) mem)
+ // match: (MOVBstoreidx ptr idx (SRWconst (MOVWreg x) [c]) mem)
// cond: c <= 24
- // result: (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+ // result: (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64SRWconst {
break
}
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v0 := b.NewValue0(v.Pos, OpPPC64SRWconst, typ.UInt32)
v0.AuxInt = c
v0.AddArg(x)
v.AddArg4(ptr, idx, v0, mem)
return true
}
- // match: (MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOVWZreg x) [c]) mem)
+ // match: (MOVBstoreidx ptr idx (SRWconst (MOVWZreg x) [c]) mem)
// cond: c <= 24
- // result: (MOVBstoreidx [off] {sym} ptr idx (SRWconst <typ.UInt32> x [c]) mem)
+ // result: (MOVBstoreidx ptr idx (SRWconst <typ.UInt32> x [c]) mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64SRWconst {
break
}
v.reset(OpPPC64MOVBstoreidx)
- v.AuxInt = off
- v.Aux = sym
v0 := b.NewValue0(v.Pos, OpPPC64SRWconst, typ.UInt32)
v0.AuxInt = c
v0.AddArg(x)
v.AddArg2(ptr, mem)
return true
}
- // match: (MOVDstore [off] {sym} p:(ADD ptr idx) val mem)
- // cond: off == 0 && sym == nil && p.Uses == 1
+ // match: (MOVDstore [0] {sym} p:(ADD ptr idx) val mem)
+ // cond: sym == nil && p.Uses == 1
// result: (MOVDstoreidx ptr idx val mem)
for {
- off := v.AuxInt
+ if v.AuxInt != 0 {
+ break
+ }
sym := v.Aux
p := v_0
if p.Op != OpPPC64ADD {
ptr := p.Args[0]
val := v_1
mem := v_2
- if !(off == 0 && sym == nil && p.Uses == 1) {
+ if !(sym == nil && p.Uses == 1) {
break
}
v.reset(OpPPC64MOVDstoreidx)
v.AddArg2(ptr, mem)
return true
}
- // match: (MOVHstore [off] {sym} p:(ADD ptr idx) val mem)
- // cond: off == 0 && sym == nil && p.Uses == 1
+ // match: (MOVHstore [0] {sym} p:(ADD ptr idx) val mem)
+ // cond: sym == nil && p.Uses == 1
// result: (MOVHstoreidx ptr idx val mem)
for {
- off := v.AuxInt
+ if v.AuxInt != 0 {
+ break
+ }
sym := v.Aux
p := v_0
if p.Op != OpPPC64ADD {
ptr := p.Args[0]
val := v_1
mem := v_2
- if !(off == 0 && sym == nil && p.Uses == 1) {
+ if !(sym == nil && p.Uses == 1) {
break
}
v.reset(OpPPC64MOVHstoreidx)
v.AddArg3(ptr, val, mem)
return true
}
- // match: (MOVHstoreidx [off] {sym} ptr idx (MOVHreg x) mem)
- // result: (MOVHstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVHstoreidx ptr idx (MOVHreg x) mem)
+ // result: (MOVHstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVHreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVHstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVHstoreidx [off] {sym} ptr idx (MOVHZreg x) mem)
- // result: (MOVHstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVHstoreidx ptr idx (MOVHZreg x) mem)
+ // result: (MOVHstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVHZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVHstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVHstoreidx [off] {sym} ptr idx (MOVWreg x) mem)
- // result: (MOVHstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVHstoreidx ptr idx (MOVWreg x) mem)
+ // result: (MOVHstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVHstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVHstoreidx [off] {sym} ptr idx (MOVWZreg x) mem)
- // result: (MOVHstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVHstoreidx ptr idx (MOVWZreg x) mem)
+ // result: (MOVHstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVHstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
v.AddArg2(ptr, mem)
return true
}
- // match: (MOVWstore [off] {sym} p:(ADD ptr idx) val mem)
- // cond: off == 0 && sym == nil && p.Uses == 1
+ // match: (MOVWstore [0] {sym} p:(ADD ptr idx) val mem)
+ // cond: sym == nil && p.Uses == 1
// result: (MOVWstoreidx ptr idx val mem)
for {
- off := v.AuxInt
+ if v.AuxInt != 0 {
+ break
+ }
sym := v.Aux
p := v_0
if p.Op != OpPPC64ADD {
ptr := p.Args[0]
val := v_1
mem := v_2
- if !(off == 0 && sym == nil && p.Uses == 1) {
+ if !(sym == nil && p.Uses == 1) {
break
}
v.reset(OpPPC64MOVWstoreidx)
v.AddArg3(ptr, val, mem)
return true
}
- // match: (MOVWstoreidx [off] {sym} ptr idx (MOVWreg x) mem)
- // result: (MOVWstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVWstoreidx ptr idx (MOVWreg x) mem)
+ // result: (MOVWstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVWstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}
- // match: (MOVWstoreidx [off] {sym} ptr idx (MOVWZreg x) mem)
- // result: (MOVWstoreidx [off] {sym} ptr idx x mem)
+ // match: (MOVWstoreidx ptr idx (MOVWZreg x) mem)
+ // result: (MOVWstoreidx ptr idx x mem)
for {
- off := v.AuxInt
- sym := v.Aux
ptr := v_0
idx := v_1
if v_2.Op != OpPPC64MOVWZreg {
x := v_2.Args[0]
mem := v_3
v.reset(OpPPC64MOVWstoreidx)
- v.AuxInt = off
- v.Aux = sym
v.AddArg4(ptr, idx, x, mem)
return true
}