]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: populate SymEffects for SSA Ops
authorMatthew Dempsky <mdempsky@google.com>
Thu, 9 Mar 2017 22:46:43 +0000 (14:46 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 14 Mar 2017 18:34:45 +0000 (18:34 +0000)
Changes to ${GOARCH}Ops.go files were mechanically produced using
github.com/mdempsky/ssa-symops, a one-off tool that inserts
"SymEffect: X" elements by pattern matching against the Op names.

Change-Id: Ibf3e481ffd588647f2a31662d72114b740ccbfcf
Reviewed-on: https://go-review.googlesource.com/38084
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/ssa/gen/386Ops.go
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/ARM64Ops.go
src/cmd/compile/internal/ssa/gen/ARMOps.go
src/cmd/compile/internal/ssa/gen/MIPS64Ops.go
src/cmd/compile/internal/ssa/gen/MIPSOps.go
src/cmd/compile/internal/ssa/gen/PPC64Ops.go
src/cmd/compile/internal/ssa/gen/S390XOps.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/gen/main.go
src/cmd/compile/internal/ssa/opGen.go

index a8fc3400fb6935fd75030b67382904b2ac2f4cf2..2a638ff1edbec75d59ba17110c3926881a25224d 100644 (file)
@@ -157,21 +157,21 @@ func init() {
                {name: "DIVSS", argLength: 2, reg: fp21, asm: "DIVSS", resultInArg0: true, usesScratch: true},                    // fp32 div
                {name: "DIVSD", argLength: 2, reg: fp21, asm: "DIVSD", resultInArg0: true},                                       // fp64 div
 
-               {name: "MOVSSload", argLength: 2, reg: fpload, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true}, // fp32 load
-               {name: "MOVSDload", argLength: 2, reg: fpload, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true}, // fp64 load
-               {name: "MOVSSconst", reg: fp01, asm: "MOVSS", aux: "Float32", rematerializeable: true},            // fp32 constant
-               {name: "MOVSDconst", reg: fp01, asm: "MOVSD", aux: "Float64", rematerializeable: true},            // fp64 constant
-               {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff"},                // fp32 load indexed by i
-               {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff"},                // fp32 load indexed by 4*i
-               {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff"},                // fp64 load indexed by i
-               {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff"},                // fp64 load indexed by 8*i
-
-               {name: "MOVSSstore", argLength: 3, reg: fpstore, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true}, // fp32 store
-               {name: "MOVSDstore", argLength: 3, reg: fpstore, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true}, // fp64 store
-               {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff"},                // fp32 indexed by i store
-               {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff"},                // fp32 indexed by 4i store
-               {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff"},                // fp64 indexed by i store
-               {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff"},                // fp64 indexed by 8i store
+               {name: "MOVSSload", argLength: 2, reg: fpload, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp32 load
+               {name: "MOVSDload", argLength: 2, reg: fpload, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp64 load
+               {name: "MOVSSconst", reg: fp01, asm: "MOVSS", aux: "Float32", rematerializeable: true},                               // fp32 constant
+               {name: "MOVSDconst", reg: fp01, asm: "MOVSD", aux: "Float64", rematerializeable: true},                               // fp64 constant
+               {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"},                // fp32 load indexed by i
+               {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"},                // fp32 load indexed by 4*i
+               {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"},                // fp64 load indexed by i
+               {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"},                // fp64 load indexed by 8*i
+
+               {name: "MOVSSstore", argLength: 3, reg: fpstore, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp32 store
+               {name: "MOVSDstore", argLength: 3, reg: fpstore, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp64 store
+               {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"},                // fp32 indexed by i store
+               {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"},                // fp32 indexed by 4i store
+               {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"},                // fp64 indexed by i store
+               {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"},                // fp64 indexed by 8i store
 
                // binary ops
                {name: "ADDL", argLength: 2, reg: gp21sp, asm: "ADDL", commutative: true, clobberFlags: true},                // arg0 + arg1
@@ -313,49 +313,49 @@ func init() {
 
                {name: "PXOR", argLength: 2, reg: fp21, asm: "PXOR", commutative: true, resultInArg0: true}, // exclusive or, applied to X regs for float negation.
 
-               {name: "LEAL", argLength: 1, reg: gp11sb, aux: "SymOff", rematerializeable: true}, // arg0 + auxint + offset encoded in aux
-               {name: "LEAL1", argLength: 2, reg: gp21sb, aux: "SymOff"},                         // arg0 + arg1 + auxint + aux
-               {name: "LEAL2", argLength: 2, reg: gp21sb, aux: "SymOff"},                         // arg0 + 2*arg1 + auxint + aux
-               {name: "LEAL4", argLength: 2, reg: gp21sb, aux: "SymOff"},                         // arg0 + 4*arg1 + auxint + aux
-               {name: "LEAL8", argLength: 2, reg: gp21sb, aux: "SymOff"},                         // arg0 + 8*arg1 + auxint + aux
+               {name: "LEAL", argLength: 1, reg: gp11sb, aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux
+               {name: "LEAL1", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                         // arg0 + arg1 + auxint + aux
+               {name: "LEAL2", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                         // arg0 + 2*arg1 + auxint + aux
+               {name: "LEAL4", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                         // arg0 + 4*arg1 + auxint + aux
+               {name: "LEAL8", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                         // arg0 + 8*arg1 + auxint + aux
                // Note: LEAL{1,2,4,8} must not have OpSB as either argument.
 
                // auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address
-               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVBLZX", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVBLSXload", argLength: 2, reg: gpload, asm: "MOVBLSX", aux: "SymOff", faultOnNilArg0: true},             // ditto, sign extend to int32
-               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVWLSXload", argLength: 2, reg: gpload, asm: "MOVWLSX", aux: "SymOff", faultOnNilArg0: true},             // ditto, sign extend to int32
-               {name: "MOVLload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true},    // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store byte in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVLstore", argLength: 3, reg: gpstore, asm: "MOVL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVBLZX", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVBLSXload", argLength: 2, reg: gpload, asm: "MOVBLSX", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},             // ditto, sign extend to int32
+               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVWLSXload", argLength: 2, reg: gpload, asm: "MOVWLSX", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},             // ditto, sign extend to int32
+               {name: "MOVLload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},    // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store byte in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVLstore", argLength: 3, reg: gpstore, asm: "MOVL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
 
                // indexed loads/stores
-               {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, asm: "MOVBLZX", aux: "SymOff"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem
-               {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff"},    // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff"},    // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem
+               {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, asm: "MOVBLZX", aux: "SymOff", symEffect: "Read"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff", symEffect: "Read"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff", symEffect: "Read"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem
+               {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", symEffect: "Read"},    // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", symEffect: "Read"},    // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem
                // TODO: sign-extending indexed loads
-               {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem
-               {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem
+               {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", symEffect: "Write"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem
+               {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem
                // TODO: add size-mismatched indexed loads, like MOVBstoreidx4.
 
                // For storeconst ops, the AuxInt field encodes both
                // the value to store and an address offset of the store.
                // Cast AuxInt to a ValAndOff to extract Val and Off fields.
-               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
-               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low 2 bytes of ...
-               {name: "MOVLstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low 4 bytes of ...
+               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
+               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low 2 bytes of ...
+               {name: "MOVLstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low 4 bytes of ...
 
-               {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", aux: "SymValAndOff", typ: "Mem"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux.  arg2=mem
-               {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem"}, // store low 2 bytes of ... arg1 ...
-               {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem"}, // store low 2 bytes of ... 2*arg1 ...
-               {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem"}, // store low 4 bytes of ... arg1 ...
-               {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem"}, // store low 4 bytes of ... 4*arg1 ...
+               {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux.  arg2=mem
+               {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... arg1 ...
+               {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... 2*arg1 ...
+               {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... arg1 ...
+               {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... 4*arg1 ...
 
                // arg0 = pointer to start of memory to zero
                // arg1 = value to store (will always be zero)
@@ -389,7 +389,7 @@ func init() {
                        faultOnNilArg0: true,
                },
 
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                             // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                          // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                        // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index 38b3db1781f901cbb9e6cbdbe7aa0eb2f0d64196..8feee0210519dda8009793e319042a997069f117 100644 (file)
@@ -163,28 +163,28 @@ func init() {
                {name: "DIVSS", argLength: 2, reg: fp21, asm: "DIVSS", resultInArg0: true},                    // fp32 div
                {name: "DIVSD", argLength: 2, reg: fp21, asm: "DIVSD", resultInArg0: true},                    // fp64 div
 
-               {name: "MOVSSload", argLength: 2, reg: fpload, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true}, // fp32 load
-               {name: "MOVSDload", argLength: 2, reg: fpload, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true}, // fp64 load
-               {name: "MOVSSconst", reg: fp01, asm: "MOVSS", aux: "Float32", rematerializeable: true},            // fp32 constant
-               {name: "MOVSDconst", reg: fp01, asm: "MOVSD", aux: "Float64", rematerializeable: true},            // fp64 constant
-               {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff"},                // fp32 load indexed by i
-               {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff"},                // fp32 load indexed by 4*i
-               {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff"},                // fp64 load indexed by i
-               {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff"},                // fp64 load indexed by 8*i
-
-               {name: "MOVSSstore", argLength: 3, reg: fpstore, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true}, // fp32 store
-               {name: "MOVSDstore", argLength: 3, reg: fpstore, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true}, // fp64 store
-               {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff"},                // fp32 indexed by i store
-               {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff"},                // fp32 indexed by 4i store
-               {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff"},                // fp64 indexed by i store
-               {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff"},                // fp64 indexed by 8i store
-
-               {name: "ADDSDmem", argLength: 3, reg: fp21load, asm: "ADDSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp32 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
-               {name: "ADDSSmem", argLength: 3, reg: fp21load, asm: "ADDSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp32 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
-               {name: "SUBSSmem", argLength: 3, reg: fp21load, asm: "SUBSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp32 arg0 - tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
-               {name: "SUBSDmem", argLength: 3, reg: fp21load, asm: "SUBSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp64 arg0 - tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
-               {name: "MULSSmem", argLength: 3, reg: fp21load, asm: "MULSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp32 arg0 * tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
-               {name: "MULSDmem", argLength: 3, reg: fp21load, asm: "MULSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true}, // fp64 arg0 * tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "MOVSSload", argLength: 2, reg: fpload, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp32 load
+               {name: "MOVSDload", argLength: 2, reg: fpload, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp64 load
+               {name: "MOVSSconst", reg: fp01, asm: "MOVSS", aux: "Float32", rematerializeable: true},                               // fp32 constant
+               {name: "MOVSDconst", reg: fp01, asm: "MOVSD", aux: "Float64", rematerializeable: true},                               // fp64 constant
+               {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"},                // fp32 load indexed by i
+               {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"},                // fp32 load indexed by 4*i
+               {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"},                // fp64 load indexed by i
+               {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"},                // fp64 load indexed by 8*i
+
+               {name: "MOVSSstore", argLength: 3, reg: fpstore, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp32 store
+               {name: "MOVSDstore", argLength: 3, reg: fpstore, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp64 store
+               {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"},                // fp32 indexed by i store
+               {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"},                // fp32 indexed by 4i store
+               {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"},                // fp64 indexed by i store
+               {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"},                // fp64 indexed by 8i store
+
+               {name: "ADDSDmem", argLength: 3, reg: fp21load, asm: "ADDSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp32 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "ADDSSmem", argLength: 3, reg: fp21load, asm: "ADDSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp32 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "SUBSSmem", argLength: 3, reg: fp21load, asm: "SUBSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp32 arg0 - tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "SUBSDmem", argLength: 3, reg: fp21load, asm: "SUBSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp64 arg0 - tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "MULSSmem", argLength: 3, reg: fp21load, asm: "MULSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp32 arg0 * tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
+               {name: "MULSDmem", argLength: 3, reg: fp21load, asm: "MULSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp64 arg0 * tmp, tmp loaded from arg1+auxint+aux, arg2 = mem
 
                // binary ops
                {name: "ADDQ", argLength: 2, reg: gp21sp, asm: "ADDQ", commutative: true, clobberFlags: true},                // arg0 + arg1
@@ -289,16 +289,16 @@ func init() {
                {name: "ROLWconst", argLength: 1, reg: gp11, asm: "ROLW", aux: "Int16", resultInArg0: true, clobberFlags: true}, // arg0 rotate left auxint, rotate amount 0-15
                {name: "ROLBconst", argLength: 1, reg: gp11, asm: "ROLB", aux: "Int8", resultInArg0: true, clobberFlags: true},  // arg0 rotate left auxint, rotate amount 0-7
 
-               {name: "ADDLmem", argLength: 3, reg: gp21load, asm: "ADDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 + tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "ADDQmem", argLength: 3, reg: gp21load, asm: "ADDQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 + tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "SUBQmem", argLength: 3, reg: gp21load, asm: "SUBQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 - tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "SUBLmem", argLength: 3, reg: gp21load, asm: "SUBL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 - tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "ANDLmem", argLength: 3, reg: gp21load, asm: "ANDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 & tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "ANDQmem", argLength: 3, reg: gp21load, asm: "ANDQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 & tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "ORQmem", argLength: 3, reg: gp21load, asm: "ORQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 | tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "ORLmem", argLength: 3, reg: gp21load, asm: "ORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 | tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "XORQmem", argLength: 3, reg: gp21load, asm: "XORQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 ^ tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
-               {name: "XORLmem", argLength: 3, reg: gp21load, asm: "XORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 ^ tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ADDLmem", argLength: 3, reg: gp21load, asm: "ADDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 + tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ADDQmem", argLength: 3, reg: gp21load, asm: "ADDQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 + tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "SUBQmem", argLength: 3, reg: gp21load, asm: "SUBQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 - tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "SUBLmem", argLength: 3, reg: gp21load, asm: "SUBL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 - tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ANDLmem", argLength: 3, reg: gp21load, asm: "ANDL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 & tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ANDQmem", argLength: 3, reg: gp21load, asm: "ANDQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 & tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ORQmem", argLength: 3, reg: gp21load, asm: "ORQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 | tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "ORLmem", argLength: 3, reg: gp21load, asm: "ORL", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 | tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "XORQmem", argLength: 3, reg: gp21load, asm: "XORQ", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 ^ tmp, tmp loaded from  arg1+auxint+aux, arg2 = mem
+               {name: "XORLmem", 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
 
                // unary ops
                {name: "NEGQ", argLength: 1, reg: gp11, asm: "NEGQ", resultInArg0: true, clobberFlags: true}, // -arg0
@@ -371,63 +371,63 @@ func init() {
 
                {name: "PXOR", argLength: 2, reg: fp21, asm: "PXOR", commutative: true, resultInArg0: true}, // exclusive or, applied to X regs for float negation.
 
-               {name: "LEAQ", argLength: 1, reg: gp11sb, asm: "LEAQ", aux: "SymOff", rematerializeable: true}, // arg0 + auxint + offset encoded in aux
-               {name: "LEAQ1", argLength: 2, reg: gp21sb, aux: "SymOff"},                                      // arg0 + arg1 + auxint + aux
-               {name: "LEAQ2", argLength: 2, reg: gp21sb, aux: "SymOff"},                                      // arg0 + 2*arg1 + auxint + aux
-               {name: "LEAQ4", argLength: 2, reg: gp21sb, aux: "SymOff"},                                      // arg0 + 4*arg1 + auxint + aux
-               {name: "LEAQ8", argLength: 2, reg: gp21sb, aux: "SymOff"},                                      // arg0 + 8*arg1 + auxint + aux
+               {name: "LEAQ", argLength: 1, reg: gp11sb, asm: "LEAQ", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux
+               {name: "LEAQ1", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                                      // arg0 + arg1 + auxint + aux
+               {name: "LEAQ2", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                                      // arg0 + 2*arg1 + auxint + aux
+               {name: "LEAQ4", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                                      // arg0 + 4*arg1 + auxint + aux
+               {name: "LEAQ8", argLength: 2, reg: gp21sb, aux: "SymOff", symEffect: "Addr"},                                      // arg0 + 8*arg1 + auxint + aux
                // Note: LEAQ{1,2,4,8} must not have OpSB as either argument.
 
-               {name: "LEAL", argLength: 1, reg: gp11sb, asm: "LEAL", aux: "SymOff", rematerializeable: true}, // arg0 + auxint + offset encoded in aux
+               {name: "LEAL", argLength: 1, reg: gp11sb, asm: "LEAL", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux
 
                // auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address
-               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVBLZX", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVBQSXload", argLength: 2, reg: gpload, asm: "MOVBQSX", aux: "SymOff", faultOnNilArg0: true},             // ditto, sign extend to int64
-               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVWQSXload", argLength: 2, reg: gpload, asm: "MOVWQSX", aux: "SymOff", faultOnNilArg0: true},             // ditto, sign extend to int64
-               {name: "MOVLload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true},    // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVLQSXload", argLength: 2, reg: gpload, asm: "MOVLQSX", aux: "SymOff", faultOnNilArg0: true},             // ditto, sign extend to int64
-               {name: "MOVQload", argLength: 2, reg: gpload, asm: "MOVQ", aux: "SymOff", typ: "UInt64", faultOnNilArg0: true},    // load 8 bytes from arg0+auxint+aux. arg1=mem
-               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store byte in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVLstore", argLength: 3, reg: gpstore, asm: "MOVL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVQstore", argLength: 3, reg: gpstore, asm: "MOVQ", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},     // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVOload", argLength: 2, reg: fpload, asm: "MOVUPS", aux: "SymOff", typ: "Int128", faultOnNilArg0: true},  // load 16 bytes from arg0+auxint+aux. arg1=mem
-               {name: "MOVOstore", argLength: 3, reg: fpstore, asm: "MOVUPS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},   // store 16 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVBLZX", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVBQSXload", argLength: 2, reg: gpload, asm: "MOVBQSX", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},             // ditto, sign extend to int64
+               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVWQSXload", argLength: 2, reg: gpload, asm: "MOVWQSX", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},             // ditto, sign extend to int64
+               {name: "MOVLload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},    // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVLQSXload", argLength: 2, reg: gpload, asm: "MOVLQSX", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},             // ditto, sign extend to int64
+               {name: "MOVQload", argLength: 2, reg: gpload, asm: "MOVQ", aux: "SymOff", typ: "UInt64", faultOnNilArg0: true, symEffect: "Read"},    // load 8 bytes from arg0+auxint+aux. arg1=mem
+               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store byte in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVLstore", argLength: 3, reg: gpstore, asm: "MOVL", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVQstore", argLength: 3, reg: gpstore, asm: "MOVQ", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},    // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVOload", argLength: 2, reg: fpload, asm: "MOVUPS", aux: "SymOff", typ: "Int128", faultOnNilArg0: true, symEffect: "Read"},  // load 16 bytes from arg0+auxint+aux. arg1=mem
+               {name: "MOVOstore", argLength: 3, reg: fpstore, asm: "MOVUPS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},  // store 16 bytes in arg1 to arg0+auxint+aux. arg2=mem
 
                // indexed loads/stores
-               {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, asm: "MOVBLZX", aux: "SymOff"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem
-               {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff"},    // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff"},    // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem
-               {name: "MOVQloadidx1", argLength: 3, reg: gploadidx, asm: "MOVQ", aux: "SymOff"},    // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVQloadidx8", argLength: 3, reg: gploadidx, asm: "MOVQ", aux: "SymOff"},    // load 8 bytes from arg0+8*arg1+auxint+aux. arg2=mem
+               {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, asm: "MOVBLZX", aux: "SymOff", symEffect: "Read"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff", symEffect: "Read"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff", symEffect: "Read"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem
+               {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", symEffect: "Read"},    // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", symEffect: "Read"},    // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem
+               {name: "MOVQloadidx1", argLength: 3, reg: gploadidx, asm: "MOVQ", aux: "SymOff", symEffect: "Read"},    // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVQloadidx8", argLength: 3, reg: gploadidx, asm: "MOVQ", aux: "SymOff", symEffect: "Read"},    // load 8 bytes from arg0+8*arg1+auxint+aux. arg2=mem
                // TODO: sign-extending indexed loads
-               {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem
-               {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem
-               {name: "MOVQstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff"}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVQstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff"}, // store 8 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem
+               {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", symEffect: "Write"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem
+               {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem
+               {name: "MOVQstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVQstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem
                // TODO: add size-mismatched indexed loads, like MOVBstoreidx4.
 
                // For storeconst ops, the AuxInt field encodes both
                // the value to store and an address offset of the store.
                // Cast AuxInt to a ValAndOff to extract Val and Off fields.
-               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
-               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low 2 bytes of ...
-               {name: "MOVLstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store low 4 bytes of ...
-               {name: "MOVQstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of ...
-
-               {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", aux: "SymValAndOff", typ: "Mem"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux.  arg2=mem
-               {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem"}, // store low 2 bytes of ... arg1 ...
-               {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem"}, // store low 2 bytes of ... 2*arg1 ...
-               {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem"}, // store low 4 bytes of ... arg1 ...
-               {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem"}, // store low 4 bytes of ... 4*arg1 ...
-               {name: "MOVQstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem"}, // store 8 bytes of ... arg1 ...
-               {name: "MOVQstoreconstidx8", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem"}, // store 8 bytes of ... 8*arg1 ...
+               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
+               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low 2 bytes of ...
+               {name: "MOVLstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low 4 bytes of ...
+               {name: "MOVQstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of ...
+
+               {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux.  arg2=mem
+               {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... arg1 ...
+               {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... 2*arg1 ...
+               {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... arg1 ...
+               {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... 4*arg1 ...
+               {name: "MOVQstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... arg1 ...
+               {name: "MOVQstoreconstidx8", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... 8*arg1 ...
 
                // arg0 = pointer to start of memory to zero
                // arg1 = value to store (will always be zero)
@@ -462,7 +462,7 @@ func init() {
                        faultOnNilArg0: true,
                },
 
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                             // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                          // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                        // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
@@ -540,22 +540,22 @@ func init() {
                // Atomic loads.  These are just normal loads but return <value,memory> tuples
                // so they can be properly ordered with other loads.
                // load from arg0+auxint+aux.  arg1=mem.
-               {name: "MOVLatomicload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", faultOnNilArg0: true},
-               {name: "MOVQatomicload", argLength: 2, reg: gpload, asm: "MOVQ", aux: "SymOff", faultOnNilArg0: true},
+               {name: "MOVLatomicload", argLength: 2, reg: gpload, asm: "MOVL", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
+               {name: "MOVQatomicload", argLength: 2, reg: gpload, asm: "MOVQ", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
 
                // Atomic stores and exchanges.  Stores use XCHG to get the right memory ordering semantics.
                // store arg0 to arg1+auxint+aux, arg2=mem.
                // These ops return a tuple of <old contents of *(arg1+auxint+aux), memory>.
                // Note: arg0 and arg1 are backwards compared to MOVLstore (to facilitate resultInArg0)!
-               {name: "XCHGL", argLength: 3, reg: gpstorexchg, asm: "XCHGL", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, hasSideEffects: true},
-               {name: "XCHGQ", argLength: 3, reg: gpstorexchg, asm: "XCHGQ", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, hasSideEffects: true},
+               {name: "XCHGL", argLength: 3, reg: gpstorexchg, asm: "XCHGL", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "XCHGQ", argLength: 3, reg: gpstorexchg, asm: "XCHGQ", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, hasSideEffects: true, symEffect: "RdWr"},
 
                // Atomic adds.
                // *(arg1+auxint+aux) += arg0.  arg2=mem.
                // Returns a tuple of <old contents of *(arg1+auxint+aux), memory>.
                // Note: arg0 and arg1 are backwards compared to MOVLstore (to facilitate resultInArg0)!
-               {name: "XADDLlock", argLength: 3, reg: gpstorexchg, asm: "XADDL", typ: "(UInt32,Mem)", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, hasSideEffects: true},
-               {name: "XADDQlock", argLength: 3, reg: gpstorexchg, asm: "XADDQ", typ: "(UInt64,Mem)", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, hasSideEffects: true},
+               {name: "XADDLlock", argLength: 3, reg: gpstorexchg, asm: "XADDL", typ: "(UInt32,Mem)", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "XADDQlock", argLength: 3, reg: gpstorexchg, asm: "XADDQ", typ: "(UInt64,Mem)", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, hasSideEffects: true, symEffect: "RdWr"},
                {name: "AddTupleFirst32", argLength: 2}, // arg0=tuple <x,y>.  Returns <x+arg1,y>.
                {name: "AddTupleFirst64", argLength: 2}, // arg0=tuple <x,y>.  Returns <x+arg1,y>.
 
@@ -578,12 +578,12 @@ func init() {
                //    JEQ ...
                // but we can't do that because memory-using ops can't generate flags yet
                // (flagalloc wants to move flag-generating instructions around).
-               {name: "CMPXCHGLlock", argLength: 4, reg: cmpxchg, asm: "CMPXCHGL", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
-               {name: "CMPXCHGQlock", argLength: 4, reg: cmpxchg, asm: "CMPXCHGQ", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
+               {name: "CMPXCHGLlock", argLength: 4, reg: cmpxchg, asm: "CMPXCHGL", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "CMPXCHGQlock", argLength: 4, reg: cmpxchg, asm: "CMPXCHGQ", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
 
                // Atomic memory updates.
-               {name: "ANDBlock", argLength: 3, reg: gpstore, asm: "ANDB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true}, // *(arg0+auxint+aux) &= arg1
-               {name: "ORBlock", argLength: 3, reg: gpstore, asm: "ORB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},   // *(arg0+auxint+aux) |= arg1
+               {name: "ANDBlock", argLength: 3, reg: gpstore, asm: "ANDB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"}, // *(arg0+auxint+aux) &= arg1
+               {name: "ORBlock", argLength: 3, reg: gpstore, asm: "ORB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},   // *(arg0+auxint+aux) |= arg1
        }
 
        var AMD64blocks = []blockData{
index 0f90c4d3a32f02b8fba4884704af373eee7d3ef9..be7fa219b23594998be1623d3cf173853ee09704 100644 (file)
@@ -259,29 +259,29 @@ func init() {
                {name: "FMOVSconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVS", typ: "Float32", rematerializeable: true}, // auxint as 64-bit float, convert to 32-bit float
                {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", typ: "Float64", rematerializeable: true}, // auxint as 64-bit float
 
-               {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
-
-               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true},      // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true},   // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true},     // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "Int32", faultOnNilArg0: true},     // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVWU", typ: "UInt32", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVDload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVD", typ: "UInt64", faultOnNilArg0: true},    // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "FMOVSload", argLength: 2, reg: fpload, aux: "SymOff", asm: "FMOVS", typ: "Float32", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "FMOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "FMOVD", typ: "Float64", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-
-               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true},   // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true},   // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true},   // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVDstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true},   // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "FMOVSstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "FMOVS", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "FMOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "FMOVD", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-
-               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVDstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of zero to arg0 + auxInt + aux.  ar12=mem.
+               {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
+
+               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"},      // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},   // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},     // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},     // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVWU", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVDload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVD", typ: "UInt64", faultOnNilArg0: true, symEffect: "Read"},    // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "FMOVSload", argLength: 2, reg: fpload, aux: "SymOff", asm: "FMOVS", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "FMOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "FMOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+
+               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},   // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},   // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},   // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVDstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},   // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "FMOVSstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "FMOVS", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "FMOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "FMOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+
+               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVDstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of zero to arg0 + auxInt + aux.  ar12=mem.
 
                // conversions
                {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},   // move from arg0, sign-extended from byte
@@ -318,7 +318,7 @@ func init() {
                {name: "CSELULT0", argLength: 2, reg: gp1flags1, asm: "CSEL"}, // returns arg0 if flags indicates unsigned LT, 0 otherwise, arg1=flags
 
                // function calls
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                              // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                           // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R26"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                         // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index a6ca735c2b40f27ecf37c45f355617df90355834..f99df3440d031b6d90539a4377f27e5a368735f1 100644 (file)
@@ -154,7 +154,8 @@ func init() {
                        typ:          "(UInt32,UInt32)",
                        aux:          "SymOff",
                        // TODO(mdempsky): Should this be true?
-                       call: false,
+                       call:      false,
+                       symEffect: "None",
                },
 
                {name: "ADDS", argLength: 2, reg: gp21carry, asm: "ADD", commutative: true}, // arg0 + arg1, set carry flag
@@ -326,21 +327,21 @@ func init() {
                {name: "MOVFconst", argLength: 0, reg: fp01, aux: "Float64", asm: "MOVF", typ: "Float32", rematerializeable: true}, // auxint as 64-bit float, convert to 32-bit float
                {name: "MOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "MOVD", typ: "Float64", rematerializeable: true}, // auxint as 64-bit float
 
-               {name: "MOVWaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVW", rematerializeable: true}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
+               {name: "MOVWaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVW", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
 
-               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true},     // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true},    // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true},   // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"},     // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},    // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},   // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
 
-               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
 
                {name: "MOVWloadidx", argLength: 3, reg: gp2load, asm: "MOVW"},                   // load from arg0 + arg1. arg2=mem
                {name: "MOVWloadshiftLL", argLength: 3, reg: gp2load, asm: "MOVW", aux: "Int32"}, // load from arg0 + arg1<<auxInt. arg2=mem
@@ -377,7 +378,7 @@ func init() {
                {name: "SRAcond", argLength: 3, reg: gp2flags1, asm: "SRA"},                                         // arg0 >> 31 if flags indicates HS, arg0 >> arg1 otherwise, signed shift, arg2=flags
 
                // function calls
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                             // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                          // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R7"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                        // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index 2cd5ad13d612ca23fb7daeb4de8b3c1cdccc9b93..d5d49f5b5103e0f6148193637ecd866e066341a8 100644 (file)
@@ -217,29 +217,29 @@ func init() {
                {name: "MOVFconst", argLength: 0, reg: fp01, aux: "Float64", asm: "MOVF", typ: "Float32", rematerializeable: true}, // auxint as 64-bit float, convert to 32-bit float
                {name: "MOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "MOVD", typ: "Float64", rematerializeable: true}, // auxint as 64-bit float
 
-               {name: "MOVVaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVV", rematerializeable: true}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
-
-               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true},     // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true},    // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "Int32", faultOnNilArg0: true},    // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVWU", typ: "UInt32", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVVload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVV", typ: "UInt64", faultOnNilArg0: true},   // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-
-               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVVstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVV", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-
-               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVVstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVV", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of zero to arg0 + auxInt + aux.  ar12=mem.
+               {name: "MOVVaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVV", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
+
+               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"},     // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},    // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},    // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVWU", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVVload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVV", typ: "UInt64", faultOnNilArg0: true, symEffect: "Read"},   // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+
+               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVVstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVV", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+
+               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVVstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVV", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of zero to arg0 + auxInt + aux.  ar12=mem.
 
                // conversions
                {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},   // move from arg0, sign-extended from byte
@@ -264,7 +264,7 @@ func init() {
                {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"},     // float64 -> float32
 
                // function calls
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                              // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                           // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                         // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index 1612fa54e6a2ac56797f179e88fdae217ccecd36..a967969eb4f319826d4d4ac89da027226b8c4283 100644 (file)
@@ -206,25 +206,25 @@ func init() {
                {name: "MOVFconst", argLength: 0, reg: fp01, aux: "Float32", asm: "MOVF", typ: "Float32", rematerializeable: true}, // auxint as 64-bit float, convert to 32-bit float
                {name: "MOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "MOVD", typ: "Float64", rematerializeable: true}, // auxint as 64-bit float
 
-               {name: "MOVWaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVW", rematerializeable: true}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
-
-               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true},     // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true},    // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true}, // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true},   // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true},  // load from arg0 + auxInt + aux.  arg1=mem.
-
-               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
-
-               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
-               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWaddr", argLength: 1, reg: regInfo{inputs: []regMask{buildReg("SP") | buildReg("SB")}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVW", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
+
+               {name: "MOVBload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVB", typ: "Int8", faultOnNilArg0: true, symEffect: "Read"},     // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVBUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVBU", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVH", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},    // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHUload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVHU", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWload", argLength: 2, reg: gpload, aux: "SymOff", asm: "MOVW", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"},   // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVFload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVF", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVDload", argLength: 2, reg: fpload, aux: "SymOff", asm: "MOVD", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},  // load from arg0 + auxInt + aux.  arg1=mem.
+
+               {name: "MOVBstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVHstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVWstore", argLength: 3, reg: gpstore, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVFstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVF", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+               {name: "MOVDstore", argLength: 3, reg: fpstore, aux: "SymOff", asm: "MOVD", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of arg1 to arg0 + auxInt + aux.  arg2=mem.
+
+               {name: "MOVBstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVB", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 1 byte of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVHstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVH", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
+               {name: "MOVWstorezero", argLength: 2, reg: gpstore0, aux: "SymOff", asm: "MOVW", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes of zero to arg0 + auxInt + aux.  arg1=mem.
 
                // conversions
                {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB"},   // move from arg0, sign-extended from byte
@@ -248,7 +248,7 @@ func init() {
                {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"},     // float64 -> float32
 
                // function calls
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                              // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                           // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                         // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index 36ca1266ad275b8b32cc480d8485c97a51ba90a7..855798552b58178a99a3e60bed51bfb6f6e41660 100644 (file)
@@ -153,13 +153,13 @@ func init() {
                callerSave  = regMask(gp | fp | gr)
        )
        ops := []opData{
-               {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},     // arg0 + arg1
-               {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "SymOff"},    // arg0 + auxInt + aux.(*gc.Sym)
-               {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},   // arg0+arg1
-               {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true}, // arg0+arg1
-               {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},                        // arg0-arg1
-               {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},                      // arg0-arg1
-               {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},                    // arg0-arg1
+               {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true},                     // arg0 + arg1
+               {name: "ADDconst", argLength: 1, reg: gp11, asm: "ADD", aux: "SymOff", symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym)
+               {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true},                   // arg0+arg1
+               {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true},                 // arg0+arg1
+               {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"},                                        // arg0-arg1
+               {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"},                                      // arg0-arg1
+               {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"},                                    // arg0-arg1
 
                {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true}, // arg0*arg1 (signed 64-bit)
                {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true}, // arg0*arg1 (signed 32-bit)
@@ -231,34 +231,34 @@ func init() {
                {name: "ANDconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}}, asm: "ANDCC", aux: "Int64", clobberFlags: true}, // arg0&aux // and-immediate sets CC on PPC, always.
                {name: "ANDCCconst", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}}, asm: "ANDCC", aux: "Int64", typ: "Flags"},                             // arg0&aux == 0 // and-immediate sets CC on PPC, always.
 
-               {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},                                            // sign extend int8 to int64
-               {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},                                          // zero extend uint8 to uint64
-               {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},                                            // sign extend int16 to int64
-               {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},                                          // zero extend uint16 to uint64
-               {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},                                            // sign extend int32 to int64
-               {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},                                          // zero extend uint32 to uint64
-               {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true},  // zero extend uint8 to uint64
-               {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true},    // sign extend int16 to int64
-               {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true}, // zero extend uint16 to uint64
-               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true},    // sign extend int32 to int64
-               {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true}, // zero extend uint32 to uint64
-               {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true},
-
-               {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true},
-               {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true},
-               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-               {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-               {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-               {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-               {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true},
-
-               {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true}, // store zero byte to arg0+aux.  arg1=mem
-               {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true}, // store zero 2 bytes to ...
-               {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true}, // store zero 4 bytes to ...
-               {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true}, // store zero 8 bytes to ...
-
-               {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
+               {name: "MOVBreg", argLength: 1, reg: gp11, asm: "MOVB", typ: "Int64"},                                                               // sign extend int8 to int64
+               {name: "MOVBZreg", argLength: 1, reg: gp11, asm: "MOVBZ", typ: "Int64"},                                                             // zero extend uint8 to uint64
+               {name: "MOVHreg", argLength: 1, reg: gp11, asm: "MOVH", typ: "Int64"},                                                               // sign extend int16 to int64
+               {name: "MOVHZreg", argLength: 1, reg: gp11, asm: "MOVHZ", typ: "Int64"},                                                             // zero extend uint16 to uint64
+               {name: "MOVWreg", argLength: 1, reg: gp11, asm: "MOVW", typ: "Int64"},                                                               // sign extend int32 to int64
+               {name: "MOVWZreg", argLength: 1, reg: gp11, asm: "MOVWZ", typ: "Int64"},                                                             // zero extend uint32 to uint64
+               {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", faultOnNilArg0: true, symEffect: "Read"},  // zero extend uint8 to uint64
+               {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", typ: "Int16", faultOnNilArg0: true, symEffect: "Read"},    // sign extend int16 to int64
+               {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", faultOnNilArg0: true, symEffect: "Read"}, // zero extend uint16 to uint64
+               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", typ: "Int32", faultOnNilArg0: true, symEffect: "Read"},    // sign extend int32 to int64
+               {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", faultOnNilArg0: true, symEffect: "Read"}, // zero extend uint32 to uint64
+               {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "Int64", faultOnNilArg0: true, symEffect: "Read"},
+
+               {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", typ: "Float64", faultOnNilArg0: true, symEffect: "Read"},
+               {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", typ: "Float32", faultOnNilArg0: true, symEffect: "Read"},
+               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+               {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+               {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+               {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+               {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"},
+
+               {name: "MOVBstorezero", argLength: 2, reg: gpstorezero, asm: "MOVB", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store zero byte to arg0+aux.  arg1=mem
+               {name: "MOVHstorezero", argLength: 2, reg: gpstorezero, asm: "MOVH", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store zero 2 bytes to ...
+               {name: "MOVWstorezero", argLength: 2, reg: gpstorezero, asm: "MOVW", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store zero 4 bytes to ...
+               {name: "MOVDstorezero", argLength: 2, reg: gpstorezero, asm: "MOVD", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store zero 8 bytes to ...
+
+               {name: "MOVDaddr", argLength: 1, reg: regInfo{inputs: []regMask{sp | sb}, outputs: []regMask{gp}}, aux: "SymOff", asm: "MOVD", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxInt + aux.(*gc.Sym), arg0=SP/SB
 
                {name: "MOVDconst", argLength: 0, reg: gp01, aux: "Int64", asm: "MOVD", typ: "Int64", rematerializeable: true}, //
                {name: "FMOVDconst", argLength: 0, reg: fp01, aux: "Float64", asm: "FMOVD", rematerializeable: true},           //
@@ -297,7 +297,7 @@ func init() {
                // Convert pointer to integer, takes a memory operand for ordering.
                {name: "MOVDconvert", argLength: 2, reg: gp11, asm: "MOVD"},
 
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                      // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                   // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gp | sp, ctxt, 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                 // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
index 9189b144fe54e5bde2e5b26a07ea308eb628dd5a..7765d9792fda3817188febceb97a9f3c2e23efc4 100644 (file)
@@ -182,39 +182,39 @@ func init() {
                {name: "FMSUBS", argLength: 3, reg: fp31, asm: "FMSUBS", resultInArg0: true},                                             // fp32 arg1 * arg2 - arg0
                {name: "FMSUB", argLength: 3, reg: fp31, asm: "FMSUB", resultInArg0: true},                                               // fp64 arg1 * arg2 - arg0
 
-               {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true}, // fp32 load
-               {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true}, // fp64 load
-               {name: "FMOVSconst", reg: fp01, asm: "FMOVS", aux: "Float32", rematerializeable: true},            // fp32 constant
-               {name: "FMOVDconst", reg: fp01, asm: "FMOVD", aux: "Float64", rematerializeable: true},            // fp64 constant
-               {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", aux: "SymOff"},                 // fp32 load indexed by i
-               {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", aux: "SymOff"},                 // fp64 load indexed by i
-
-               {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true}, // fp32 store
-               {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true}, // fp64 store
-               {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", aux: "SymOff"},                 // fp32 indexed by i store
-               {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", aux: "SymOff"},                 // fp64 indexed by i store
+               {name: "FMOVSload", argLength: 2, reg: fpload, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp32 load
+               {name: "FMOVDload", argLength: 2, reg: fpload, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp64 load
+               {name: "FMOVSconst", reg: fp01, asm: "FMOVS", aux: "Float32", rematerializeable: true},                               // fp32 constant
+               {name: "FMOVDconst", reg: fp01, asm: "FMOVD", aux: "Float64", rematerializeable: true},                               // fp64 constant
+               {name: "FMOVSloadidx", argLength: 3, reg: fploadidx, asm: "FMOVS", aux: "SymOff", symEffect: "Read"},                 // fp32 load indexed by i
+               {name: "FMOVDloadidx", argLength: 3, reg: fploadidx, asm: "FMOVD", aux: "SymOff", symEffect: "Read"},                 // fp64 load indexed by i
+
+               {name: "FMOVSstore", argLength: 3, reg: fpstore, asm: "FMOVS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp32 store
+               {name: "FMOVDstore", argLength: 3, reg: fpstore, asm: "FMOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp64 store
+               {name: "FMOVSstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVS", aux: "SymOff", symEffect: "Write"},                 // fp32 indexed by i store
+               {name: "FMOVDstoreidx", argLength: 4, reg: fpstoreidx, asm: "FMOVD", aux: "SymOff", symEffect: "Write"},                 // fp64 indexed by i store
 
                // binary ops
-               {name: "ADD", argLength: 2, reg: gp21sp, asm: "ADD", commutative: true, clobberFlags: true},                                               // arg0 + arg1
-               {name: "ADDW", argLength: 2, reg: gp21sp, asm: "ADDW", commutative: true, clobberFlags: true},                                             // arg0 + arg1
-               {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int64", typ: "UInt64", clobberFlags: true},                                // arg0 + auxint
-               {name: "ADDWconst", argLength: 1, reg: gp11sp, asm: "ADDW", aux: "Int32", clobberFlags: true},                                             // arg0 + auxint
-               {name: "ADDload", argLength: 3, reg: gpopload, asm: "ADD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 + *arg1. arg2=mem
-               {name: "ADDWload", argLength: 3, reg: gpopload, asm: "ADDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 + *arg1. arg2=mem
-
-               {name: "SUB", argLength: 2, reg: gp21, asm: "SUB", clobberFlags: true},                                                                    // arg0 - arg1
-               {name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW", clobberFlags: true},                                                                  // arg0 - arg1
-               {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64", resultInArg0: true, clobberFlags: true},                             // arg0 - auxint
-               {name: "SUBWconst", argLength: 1, reg: gp11, asm: "SUBW", aux: "Int32", resultInArg0: true, clobberFlags: true},                           // arg0 - auxint
-               {name: "SUBload", argLength: 3, reg: gpopload, asm: "SUB", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 - *arg1. arg2=mem
-               {name: "SUBWload", argLength: 3, reg: gpopload, asm: "SUBW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 - *arg1. arg2=mem
-
-               {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true, resultInArg0: true, clobberFlags: true},             // arg0 * arg1
-               {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true, resultInArg0: true, clobberFlags: true},             // arg0 * arg1
-               {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int64", typ: "Int64", resultInArg0: true, clobberFlags: true},             // arg0 * auxint
-               {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int32", resultInArg0: true, clobberFlags: true},             // arg0 * auxint
-               {name: "MULLDload", argLength: 3, reg: gpopload, asm: "MULLD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 * *arg1. arg2=mem
-               {name: "MULLWload", argLength: 3, reg: gpopload, asm: "MULLW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 * *arg1. arg2=mem
+               {name: "ADD", argLength: 2, reg: gp21sp, asm: "ADD", commutative: true, clobberFlags: true},                                                                  // arg0 + arg1
+               {name: "ADDW", argLength: 2, reg: gp21sp, asm: "ADDW", commutative: true, clobberFlags: true},                                                                // arg0 + arg1
+               {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int64", typ: "UInt64", clobberFlags: true},                                                   // arg0 + auxint
+               {name: "ADDWconst", argLength: 1, reg: gp11sp, asm: "ADDW", aux: "Int32", clobberFlags: true},                                                                // arg0 + auxint
+               {name: "ADDload", argLength: 3, reg: gpopload, asm: "ADD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 + *arg1. arg2=mem
+               {name: "ADDWload", argLength: 3, reg: gpopload, asm: "ADDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 + *arg1. arg2=mem
+
+               {name: "SUB", argLength: 2, reg: gp21, asm: "SUB", clobberFlags: true},                                                                                       // arg0 - arg1
+               {name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW", clobberFlags: true},                                                                                     // arg0 - arg1
+               {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64", resultInArg0: true, clobberFlags: true},                                                // arg0 - auxint
+               {name: "SUBWconst", argLength: 1, reg: gp11, asm: "SUBW", aux: "Int32", resultInArg0: true, clobberFlags: true},                                              // arg0 - auxint
+               {name: "SUBload", argLength: 3, reg: gpopload, asm: "SUB", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 - *arg1. arg2=mem
+               {name: "SUBWload", argLength: 3, reg: gpopload, asm: "SUBW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 - *arg1. arg2=mem
+
+               {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true, resultInArg0: true, clobberFlags: true},                                // arg0 * arg1
+               {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true, resultInArg0: true, clobberFlags: true},                                // arg0 * arg1
+               {name: "MULLDconst", argLength: 1, reg: gp11, asm: "MULLD", aux: "Int64", typ: "Int64", resultInArg0: true, clobberFlags: true},                                // arg0 * auxint
+               {name: "MULLWconst", argLength: 1, reg: gp11, asm: "MULLW", aux: "Int32", typ: "Int32", resultInArg0: true, clobberFlags: true},                                // arg0 * auxint
+               {name: "MULLDload", argLength: 3, reg: gpopload, asm: "MULLD", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 * *arg1. arg2=mem
+               {name: "MULLWload", argLength: 3, reg: gpopload, asm: "MULLW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 * *arg1. arg2=mem
 
                {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", typ: "Int64", resultInArg0: true, clobberFlags: true},   // (arg0 * arg1) >> width
                {name: "MULHDU", argLength: 2, reg: gp21, asm: "MULHDU", typ: "Int64", resultInArg0: true, clobberFlags: true}, // (arg0 * arg1) >> width
@@ -230,26 +230,26 @@ func init() {
                {name: "MODDU", argLength: 2, reg: gp21, asm: "MODDU", resultInArg0: true, clobberFlags: true}, // arg0 % arg1
                {name: "MODWU", argLength: 2, reg: gp21, asm: "MODWU", resultInArg0: true, clobberFlags: true}, // arg0 % arg1
 
-               {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true, clobberFlags: true},                                                 // arg0 & arg1
-               {name: "ANDW", argLength: 2, reg: gp21, asm: "ANDW", commutative: true, clobberFlags: true},                                               // arg0 & arg1
-               {name: "ANDconst", argLength: 1, reg: gp11, asm: "AND", aux: "Int64", resultInArg0: true, clobberFlags: true},                             // arg0 & auxint
-               {name: "ANDWconst", argLength: 1, reg: gp11, asm: "ANDW", aux: "Int32", resultInArg0: true, clobberFlags: true},                           // arg0 & auxint
-               {name: "ANDload", argLength: 3, reg: gpopload, asm: "AND", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 & *arg1. arg2=mem
-               {name: "ANDWload", argLength: 3, reg: gpopload, asm: "ANDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 & *arg1. arg2=mem
-
-               {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true, clobberFlags: true},                                                 // arg0 | arg1
-               {name: "ORW", argLength: 2, reg: gp21, asm: "ORW", commutative: true, clobberFlags: true},                                               // arg0 | arg1
-               {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64", resultInArg0: true, clobberFlags: true},                             // arg0 | auxint
-               {name: "ORWconst", argLength: 1, reg: gp11, asm: "ORW", aux: "Int32", resultInArg0: true, clobberFlags: true},                           // arg0 | auxint
-               {name: "ORload", argLength: 3, reg: gpopload, asm: "OR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 | *arg1. arg2=mem
-               {name: "ORWload", argLength: 3, reg: gpopload, asm: "ORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 | *arg1. arg2=mem
-
-               {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", commutative: true, clobberFlags: true},                                                 // arg0 ^ arg1
-               {name: "XORW", argLength: 2, reg: gp21, asm: "XORW", commutative: true, clobberFlags: true},                                               // arg0 ^ arg1
-               {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64", resultInArg0: true, clobberFlags: true},                             // arg0 ^ auxint
-               {name: "XORWconst", argLength: 1, reg: gp11, asm: "XORW", aux: "Int32", resultInArg0: true, clobberFlags: true},                           // arg0 ^ auxint
-               {name: "XORload", argLength: 3, reg: gpopload, asm: "XOR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true},   // arg0 ^ *arg1. arg2=mem
-               {name: "XORWload", argLength: 3, reg: gpopload, asm: "XORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true}, // arg0 ^ *arg1. arg2=mem
+               {name: "AND", argLength: 2, reg: gp21, asm: "AND", commutative: true, clobberFlags: true},                                                                    // arg0 & arg1
+               {name: "ANDW", argLength: 2, reg: gp21, asm: "ANDW", commutative: true, clobberFlags: true},                                                                  // arg0 & arg1
+               {name: "ANDconst", argLength: 1, reg: gp11, asm: "AND", aux: "Int64", resultInArg0: true, clobberFlags: true},                                                // arg0 & auxint
+               {name: "ANDWconst", argLength: 1, reg: gp11, asm: "ANDW", aux: "Int32", resultInArg0: true, clobberFlags: true},                                              // arg0 & auxint
+               {name: "ANDload", argLength: 3, reg: gpopload, asm: "AND", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 & *arg1. arg2=mem
+               {name: "ANDWload", argLength: 3, reg: gpopload, asm: "ANDW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 & *arg1. arg2=mem
+
+               {name: "OR", argLength: 2, reg: gp21, asm: "OR", commutative: true, clobberFlags: true},                                                                    // arg0 | arg1
+               {name: "ORW", argLength: 2, reg: gp21, asm: "ORW", commutative: true, clobberFlags: true},                                                                  // arg0 | arg1
+               {name: "ORconst", argLength: 1, reg: gp11, asm: "OR", aux: "Int64", resultInArg0: true, clobberFlags: true},                                                // arg0 | auxint
+               {name: "ORWconst", argLength: 1, reg: gp11, asm: "ORW", aux: "Int32", resultInArg0: true, clobberFlags: true},                                              // arg0 | auxint
+               {name: "ORload", argLength: 3, reg: gpopload, asm: "OR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 | *arg1. arg2=mem
+               {name: "ORWload", argLength: 3, reg: gpopload, asm: "ORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 | *arg1. arg2=mem
+
+               {name: "XOR", argLength: 2, reg: gp21, asm: "XOR", commutative: true, clobberFlags: true},                                                                    // arg0 ^ arg1
+               {name: "XORW", argLength: 2, reg: gp21, asm: "XORW", commutative: true, clobberFlags: true},                                                                  // arg0 ^ arg1
+               {name: "XORconst", argLength: 1, reg: gp11, asm: "XOR", aux: "Int64", resultInArg0: true, clobberFlags: true},                                                // arg0 ^ auxint
+               {name: "XORWconst", argLength: 1, reg: gp11, asm: "XORW", aux: "Int32", resultInArg0: true, clobberFlags: true},                                              // arg0 ^ auxint
+               {name: "XORload", argLength: 3, reg: gpopload, asm: "XOR", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"},   // arg0 ^ *arg1. arg2=mem
+               {name: "XORWload", argLength: 3, reg: gpopload, asm: "XORW", aux: "SymOff", resultInArg0: true, clobberFlags: true, faultOnNilArg1: true, symEffect: "Read"}, // arg0 ^ *arg1. arg2=mem
 
                {name: "CMP", argLength: 2, reg: gp2flags, asm: "CMP", typ: "Flags"},   // arg0 compare to arg1
                {name: "CMPW", argLength: 2, reg: gp2flags, asm: "CMPW", typ: "Flags"}, // arg0 compare to arg1
@@ -333,63 +333,63 @@ func init() {
                {name: "LEDBR", argLength: 1, reg: fp11, asm: "LEDBR"},   // convert float64 to float32
                {name: "LDEBR", argLength: 1, reg: fp11, asm: "LDEBR"},   // convert float32 to float64
 
-               {name: "MOVDaddr", argLength: 1, reg: addr, aux: "SymOff", rematerializeable: true, clobberFlags: true}, // arg0 + auxint + offset encoded in aux
-               {name: "MOVDaddridx", argLength: 2, reg: addridx, aux: "SymOff", clobberFlags: true},                    // arg0 + arg1 + auxint + aux
+               {name: "MOVDaddr", argLength: 1, reg: addr, aux: "SymOff", rematerializeable: true, clobberFlags: true, symEffect: "Read"}, // arg0 + auxint + offset encoded in aux
+               {name: "MOVDaddridx", argLength: 2, reg: addridx, aux: "SymOff", clobberFlags: true, symEffect: "Read"},                    // arg0 + arg1 + auxint + aux
 
                // auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address
-               {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", clobberFlags: true, faultOnNilArg0: true},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true},                  // ditto, sign extend to int64
-               {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", clobberFlags: true, faultOnNilArg0: true}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true},                  // ditto, sign extend to int64
-               {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", clobberFlags: true, faultOnNilArg0: true}, // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
-               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true},                  // ditto, sign extend to int64
-               {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "UInt64", clobberFlags: true, faultOnNilArg0: true},   // load 8 bytes from arg0+auxint+aux. arg1=mem
+               {name: "MOVBZload", argLength: 2, reg: gpload, asm: "MOVBZ", aux: "SymOff", typ: "UInt8", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"},  // load byte from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVBload", argLength: 2, reg: gpload, asm: "MOVB", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"},                  // ditto, sign extend to int64
+               {name: "MOVHZload", argLength: 2, reg: gpload, asm: "MOVHZ", aux: "SymOff", typ: "UInt16", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVHload", argLength: 2, reg: gpload, asm: "MOVH", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"},                  // ditto, sign extend to int64
+               {name: "MOVWZload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", typ: "UInt32", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"}, // load 4 bytes from arg0+auxint+aux. arg1=mem.  Zero extend.
+               {name: "MOVWload", argLength: 2, reg: gpload, asm: "MOVW", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"},                  // ditto, sign extend to int64
+               {name: "MOVDload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", typ: "UInt64", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"},   // load 8 bytes from arg0+auxint+aux. arg1=mem
 
                {name: "MOVWBR", argLength: 1, reg: gp11, asm: "MOVWBR"}, // arg0 swap bytes
                {name: "MOVDBR", argLength: 1, reg: gp11, asm: "MOVDBR"}, // arg0 swap bytes
 
-               {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "UInt16", clobberFlags: true, faultOnNilArg0: true}, // load 2 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
-               {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", aux: "SymOff", typ: "UInt32", clobberFlags: true, faultOnNilArg0: true}, // load 4 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
-               {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", aux: "SymOff", typ: "UInt64", clobberFlags: true, faultOnNilArg0: true}, // load 8 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
+               {name: "MOVHBRload", argLength: 2, reg: gpload, asm: "MOVHBR", aux: "SymOff", typ: "UInt16", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"}, // load 2 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
+               {name: "MOVWBRload", argLength: 2, reg: gpload, asm: "MOVWBR", aux: "SymOff", typ: "UInt32", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"}, // load 4 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
+               {name: "MOVDBRload", argLength: 2, reg: gpload, asm: "MOVDBR", aux: "SymOff", typ: "UInt64", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read"}, // load 8 bytes from arg0+auxint+aux. arg1=mem. Reverse bytes.
 
-               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true},       // store byte in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true},       // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true},       // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true},       // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem
-               {name: "MOVHBRstore", argLength: 3, reg: gpstorebr, asm: "MOVHBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
-               {name: "MOVWBRstore", argLength: 3, reg: gpstorebr, asm: "MOVWBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
-               {name: "MOVDBRstore", argLength: 3, reg: gpstorebr, asm: "MOVDBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVBstore", argLength: 3, reg: gpstore, asm: "MOVB", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},       // store byte in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVHstore", argLength: 3, reg: gpstore, asm: "MOVH", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},       // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVWstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},       // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVDstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},       // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem
+               {name: "MOVHBRstore", argLength: 3, reg: gpstorebr, asm: "MOVHBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store 2 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVWBRstore", argLength: 3, reg: gpstorebr, asm: "MOVWBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store 4 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVDBRstore", argLength: 3, reg: gpstorebr, asm: "MOVDBR", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes in arg1 to arg0+auxint+aux. arg2=mem. Reverse bytes.
 
-               {name: "MVC", argLength: 3, reg: gpmvc, asm: "MVC", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, faultOnNilArg1: true}, // arg0=destptr, arg1=srcptr, arg2=mem, auxint=size,off
+               {name: "MVC", argLength: 3, reg: gpmvc, asm: "MVC", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, faultOnNilArg1: true, symEffect: "None"}, // arg0=destptr, arg1=srcptr, arg2=mem, auxint=size,off
 
                // indexed loads/stores
                // TODO(mundaym): add sign-extended indexed loads
-               {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", aux: "SymOff", clobberFlags: true},     // load a byte from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", aux: "SymOff", clobberFlags: true},     // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", aux: "SymOff", clobberFlags: true},     // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", aux: "SymOff", clobberFlags: true},       // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem
-               {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", aux: "SymOff", clobberFlags: true},   // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
-               {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", aux: "SymOff", clobberFlags: true},   // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
-               {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", aux: "SymOff", clobberFlags: true},   // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
-               {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", clobberFlags: true},     // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", aux: "SymOff", clobberFlags: true},     // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", clobberFlags: true},     // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", aux: "SymOff", clobberFlags: true},     // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
-               {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", aux: "SymOff", clobberFlags: true}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
-               {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", aux: "SymOff", clobberFlags: true}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
-               {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", aux: "SymOff", clobberFlags: true}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
+               {name: "MOVBZloadidx", argLength: 3, reg: gploadidx, asm: "MOVBZ", aux: "SymOff", clobberFlags: true, symEffect: "Read"},      // load a byte from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVHZloadidx", argLength: 3, reg: gploadidx, asm: "MOVHZ", aux: "SymOff", clobberFlags: true, symEffect: "Read"},      // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVWZloadidx", argLength: 3, reg: gploadidx, asm: "MOVWZ", aux: "SymOff", clobberFlags: true, symEffect: "Read"},      // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVDloadidx", argLength: 3, reg: gploadidx, asm: "MOVD", aux: "SymOff", clobberFlags: true, symEffect: "Read"},        // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem
+               {name: "MOVHBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVHBR", aux: "SymOff", clobberFlags: true, symEffect: "Read"},    // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVWBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVWBR", aux: "SymOff", clobberFlags: true, symEffect: "Read"},    // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVDBRloadidx", argLength: 3, reg: gploadidx, asm: "MOVDBR", aux: "SymOff", clobberFlags: true, symEffect: "Read"},    // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem. Reverse bytes.
+               {name: "MOVBstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", clobberFlags: true, symEffect: "Write"},     // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVHstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVH", aux: "SymOff", clobberFlags: true, symEffect: "Write"},     // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVWstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", clobberFlags: true, symEffect: "Write"},     // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVDstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVD", aux: "SymOff", clobberFlags: true, symEffect: "Write"},     // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem
+               {name: "MOVHBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVHBR", aux: "SymOff", clobberFlags: true, symEffect: "Write"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
+               {name: "MOVWBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVWBR", aux: "SymOff", clobberFlags: true, symEffect: "Write"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
+               {name: "MOVDBRstoreidx", argLength: 4, reg: gpstoreidx, asm: "MOVDBR", aux: "SymOff", clobberFlags: true, symEffect: "Write"}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem. Reverse bytes.
 
                // For storeconst ops, the AuxInt field encodes both
                // the value to store and an address offset of the store.
                // Cast AuxInt to a ValAndOff to extract Val and Off fields.
-               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
-               {name: "MOVHstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVH", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store low 2 bytes of ...
-               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store low 4 bytes of ...
-               {name: "MOVDstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVD", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true}, // store 8 bytes of ...
+               {name: "MOVBstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+ValAndOff(AuxInt).Off()+aux.  arg1=mem
+               {name: "MOVHstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVH", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store low 2 bytes of ...
+               {name: "MOVWstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store low 4 bytes of ...
+               {name: "MOVDstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVD", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of ...
 
-               {name: "CLEAR", argLength: 2, reg: regInfo{inputs: []regMask{ptr, 0}}, asm: "CLEAR", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true},
+               {name: "CLEAR", argLength: 2, reg: regInfo{inputs: []regMask{ptr, 0}}, asm: "CLEAR", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"},
 
-               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true},                                               // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
+               {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"},                            // call static function aux.(*gc.Sym).  arg0=mem, auxint=argsize, returns mem
                {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{ptrsp, buildReg("R12"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure.  arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem
                {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{ptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true},                         // call fn by pointer.  arg0=codeptr, arg1=mem, auxint=argsize, returns mem
 
@@ -430,19 +430,19 @@ func init() {
                // Atomic loads. These are just normal loads but return <value,memory> tuples
                // so they can be properly ordered with other loads.
                // load from arg0+auxint+aux.  arg1=mem.
-               {name: "MOVWZatomicload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", faultOnNilArg0: true},
-               {name: "MOVDatomicload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", faultOnNilArg0: true},
+               {name: "MOVWZatomicload", argLength: 2, reg: gpload, asm: "MOVWZ", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
+               {name: "MOVDatomicload", argLength: 2, reg: gpload, asm: "MOVD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"},
 
                // Atomic stores. These are just normal stores.
                // store arg1 to arg0+auxint+aux. arg2=mem.
-               {name: "MOVWatomicstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
-               {name: "MOVDatomicstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
+               {name: "MOVWatomicstore", argLength: 3, reg: gpstore, asm: "MOVW", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "Write"},
+               {name: "MOVDatomicstore", argLength: 3, reg: gpstore, asm: "MOVD", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "Write"},
 
                // Atomic adds.
                // *(arg0+auxint+aux) += arg1.  arg2=mem.
                // Returns a tuple of <old contents of *(arg0+auxint+aux), memory>.
-               {name: "LAA", argLength: 3, reg: gpstorelaa, asm: "LAA", typ: "(UInt32,Mem)", aux: "SymOff", faultOnNilArg0: true, hasSideEffects: true},
-               {name: "LAAG", argLength: 3, reg: gpstorelaa, asm: "LAAG", typ: "(UInt64,Mem)", aux: "SymOff", faultOnNilArg0: true, hasSideEffects: true},
+               {name: "LAA", argLength: 3, reg: gpstorelaa, asm: "LAA", typ: "(UInt32,Mem)", aux: "SymOff", faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "LAAG", argLength: 3, reg: gpstorelaa, asm: "LAAG", typ: "(UInt64,Mem)", aux: "SymOff", faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
                {name: "AddTupleFirst32", argLength: 2}, // arg0=tuple <x,y>.  Returns <x+arg1,y>.
                {name: "AddTupleFirst64", argLength: 2}, // arg0=tuple <x,y>.  Returns <x+arg1,y>.
 
@@ -467,13 +467,13 @@ func init() {
                //    BEQ ...
                // but we can't do that because memory-using ops can't generate flags yet
                // (flagalloc wants to move flag-generating instructions around).
-               {name: "LoweredAtomicCas32", argLength: 4, reg: cas, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
-               {name: "LoweredAtomicCas64", argLength: 4, reg: cas, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
+               {name: "LoweredAtomicCas32", argLength: 4, reg: cas, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "LoweredAtomicCas64", argLength: 4, reg: cas, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
 
                // Lowered atomic swaps, emulated using compare-and-swap.
                // store arg1 to arg0+auxint+aux, arg2=mem.
-               {name: "LoweredAtomicExchange32", argLength: 3, reg: exchange, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
-               {name: "LoweredAtomicExchange64", argLength: 3, reg: exchange, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true},
+               {name: "LoweredAtomicExchange32", argLength: 3, reg: exchange, asm: "CS", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
+               {name: "LoweredAtomicExchange64", argLength: 3, reg: exchange, asm: "CSG", aux: "SymOff", clobberFlags: true, faultOnNilArg0: true, hasSideEffects: true, symEffect: "RdWr"},
 
                // find leftmost one
                {
@@ -494,6 +494,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMG",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
                {
                        name:           "STMG3",
@@ -503,6 +504,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMG",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
                {
                        name:      "STMG4",
@@ -519,6 +521,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMG",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
                {
                        name:           "STM2",
@@ -528,6 +531,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMY",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
                {
                        name:           "STM3",
@@ -537,6 +541,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMY",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
                {
                        name:      "STM4",
@@ -553,6 +558,7 @@ func init() {
                        typ:            "Mem",
                        asm:            "STMY",
                        faultOnNilArg0: true,
+                       symEffect:      "Write",
                },
 
                // large move
index 000baa686b3e993d37c58e982135efc60518b056..af96a2c4c962f4598ed2ba3d7b5396b55155e81b 100644 (file)
@@ -272,19 +272,19 @@ var genericOps = []opData{
        {name: "ConstSlice"},               // nil slice
 
        // Constant-like things
-       {name: "InitMem"},            // memory input to the function.
-       {name: "Arg", aux: "SymOff"}, // argument to the function.  aux=GCNode of arg, off = offset in that arg.
+       {name: "InitMem"},                               // memory input to the function.
+       {name: "Arg", aux: "SymOff", symEffect: "None"}, // argument to the function.  aux=GCNode of arg, off = offset in that arg.
 
        // The address of a variable.  arg0 is the base pointer (SB or SP, depending
        // on whether it is a global or stack variable).  The Aux field identifies the
        // variable. It will be either an *ExternSymbol (with arg0=SB), *ArgSymbol (arg0=SP),
        // or *AutoSymbol (arg0=SP).
-       {name: "Addr", argLength: 1, aux: "Sym"}, // Address of a variable.  Arg0=SP or SB.  Aux identifies the variable.
+       {name: "Addr", argLength: 1, aux: "Sym", symEffect: "Addr"}, // Address of a variable.  Arg0=SP or SB.  Aux identifies the variable.
 
-       {name: "SP"},                 // stack pointer
-       {name: "SB", typ: "Uintptr"}, // static base pointer (a.k.a. globals pointer)
-       {name: "Func", aux: "Sym"},   // entry address of a function
-       {name: "Invalid"},            // unused value
+       {name: "SP"},                                  // stack pointer
+       {name: "SB", typ: "Uintptr"},                  // static base pointer (a.k.a. globals pointer)
+       {name: "Func", aux: "Sym", symEffect: "None"}, // entry address of a function
+       {name: "Invalid"},                             // unused value
 
        // Memory operations
        {name: "Load", argLength: 2},                                  // Load from arg0.  arg1=memory
@@ -294,16 +294,16 @@ var genericOps = []opData{
 
        // Memory operations with write barriers.
        // Expand to runtime calls. Write barrier will be removed if write on stack.
-       {name: "StoreWB", argLength: 3, typ: "Mem", aux: "Int64"},          // Store arg1 to arg0. arg2=memory, auxint=size.  Returns memory.
-       {name: "MoveWB", argLength: 3, typ: "Mem", aux: "SymSizeAndAlign"}, // arg0=destptr, arg1=srcptr, arg2=mem, auxint=size+alignment, aux=symbol-of-type (for typedmemmove).  Returns memory.
-       {name: "ZeroWB", argLength: 2, typ: "Mem", aux: "SymSizeAndAlign"}, // arg0=destptr, arg1=mem, auxint=size+alignment, aux=symbol-of-type. Returns memory.
+       {name: "StoreWB", argLength: 3, typ: "Mem", aux: "Int64"},                             // Store arg1 to arg0. arg2=memory, auxint=size.  Returns memory.
+       {name: "MoveWB", argLength: 3, typ: "Mem", aux: "SymSizeAndAlign", symEffect: "None"}, // arg0=destptr, arg1=srcptr, arg2=mem, auxint=size+alignment, aux=symbol-of-type (for typedmemmove).  Returns memory.
+       {name: "ZeroWB", argLength: 2, typ: "Mem", aux: "SymSizeAndAlign", symEffect: "None"}, // arg0=destptr, arg1=mem, auxint=size+alignment, aux=symbol-of-type. Returns memory.
 
        // Function calls. Arguments to the call have already been written to the stack.
        // Return values appear on the stack. The method receiver, if any, is treated
        // as a phantom first argument.
-       {name: "ClosureCall", argLength: 3, aux: "Int64", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory.  auxint=arg size.  Returns memory.
-       {name: "StaticCall", argLength: 1, aux: "SymOff", call: true}, // call function aux.(*gc.Sym), arg0=memory.  auxint=arg size.  Returns memory.
-       {name: "InterCall", argLength: 2, aux: "Int64", call: true},   // interface call.  arg0=code pointer, arg1=memory, auxint=arg size.  Returns memory.
+       {name: "ClosureCall", argLength: 3, aux: "Int64", call: true},                    // arg0=code pointer, arg1=context ptr, arg2=memory.  auxint=arg size.  Returns memory.
+       {name: "StaticCall", argLength: 1, aux: "SymOff", call: true, symEffect: "None"}, // call function aux.(*gc.Sym), arg0=memory.  auxint=arg size.  Returns memory.
+       {name: "InterCall", argLength: 2, aux: "Int64", call: true},                      // interface call.  arg0=code pointer, arg1=memory, auxint=arg size.  Returns memory.
 
        // Conversions: signed extensions, zero (unsigned) extensions, truncations
        {name: "SignExt8to16", argLength: 1, typ: "Int16"},
@@ -396,15 +396,15 @@ var genericOps = []opData{
        {name: "LoadReg", argLength: 1},
 
        // Used during ssa construction. Like Copy, but the arg has not been specified yet.
-       {name: "FwdRef", aux: "Sym"},
+       {name: "FwdRef", aux: "Sym", symEffect: "None"},
 
        // Unknown value. Used for Values whose values don't matter because they are dead code.
        {name: "Unknown"},
 
-       {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem"}, // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
-       {name: "VarKill", argLength: 1, aux: "Sym"},            // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
-       {name: "VarLive", argLength: 1, aux: "Sym"},            // aux is a *gc.Node of a variable that must be kept live.  arg0=mem, returns mem
-       {name: "KeepAlive", argLength: 2, typ: "Mem"},          // arg[0] is a value that must be kept alive until this mark.  arg[1]=mem, returns mem
+       {name: "VarDef", argLength: 1, aux: "Sym", typ: "Mem", symEffect: "None"}, // aux is a *gc.Node of a variable that is about to be initialized.  arg0=mem, returns mem
+       {name: "VarKill", argLength: 1, aux: "Sym", symEffect: "None"},            // aux is a *gc.Node of a variable that is known to be dead.  arg0=mem, returns mem
+       {name: "VarLive", argLength: 1, aux: "Sym", symEffect: "None"},            // aux is a *gc.Node of a variable that must be kept live.  arg0=mem, returns mem
+       {name: "KeepAlive", argLength: 2, typ: "Mem"},                             // arg[0] is a value that must be kept alive until this mark.  arg[1]=mem, returns mem
 
        // Ops for breaking 64-bit operations on 32-bit architectures
        {name: "Int64Make", argLength: 2, typ: "UInt64"}, // arg0=hi, arg1=lo
index 757c752e64f939f0203839d0ffe13364025d287c..78613ad35247c2260cf01318950596b5daffb7f2 100644 (file)
@@ -214,11 +214,14 @@ func genOp() {
                        if v.hasSideEffects {
                                fmt.Fprintln(w, "hasSideEffects: true,")
                        }
+                       needEffect := strings.HasPrefix(v.aux, "Sym")
                        if v.symEffect != "" {
-                               if !strings.HasPrefix(v.aux, "Sym") {
+                               if !needEffect {
                                        log.Fatalf("symEffect with aux %s not allowed", v.aux)
                                }
                                fmt.Fprintf(w, "symEffect: Sym%s,\n", v.symEffect)
+                       } else if needEffect {
+                               log.Fatalf("symEffect needed for aux %s", v.aux)
                        }
                        if a.name == "generic" {
                                fmt.Fprintln(w, "generic:true,")
index 30287d8fa5f8d22f222d92bd9c189267ba055986..4485e3583aaa1d11612c30db73054f52aff284a4 100644 (file)
@@ -2034,6 +2034,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -2049,6 +2050,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -2084,10 +2086,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2099,10 +2102,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSloadidx4",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSloadidx4",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2114,10 +2118,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2129,10 +2134,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDloadidx8",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDloadidx8",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2148,6 +2154,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -2161,6 +2168,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -2170,10 +2178,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2183,10 +2192,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSstoreidx4",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSstoreidx4",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2196,10 +2206,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -2209,10 +2220,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDstoreidx8",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDstoreidx8",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3622,6 +3634,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 65791}, // AX CX DX BX SP BP SI DI SB
@@ -3632,9 +3645,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAL1",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAL1",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3646,9 +3660,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAL2",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAL2",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3660,9 +3675,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAL4",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAL4",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3674,9 +3690,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAL8",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAL8",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3692,6 +3709,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVBLZX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3707,6 +3725,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVBLSX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3722,6 +3741,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3737,6 +3757,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVWLSX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3752,6 +3773,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3767,6 +3789,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3780,6 +3803,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3793,6 +3817,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3802,10 +3827,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVBLZX,
+               name:      "MOVBloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVBLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3817,10 +3843,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVWLZX,
+               name:      "MOVWloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3832,10 +3859,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWloadidx2",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVWLZX,
+               name:      "MOVWloadidx2",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3847,10 +3875,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3862,10 +3891,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLloadidx4",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLloadidx4",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3877,10 +3907,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVB,
+               name:      "MOVBstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3890,10 +3921,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3903,10 +3935,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreidx2",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreidx2",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3916,10 +3949,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3929,10 +3963,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreidx4",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreidx4",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3946,6 +3981,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3958,6 +3994,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3970,6 +4007,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -3978,10 +4016,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVB,
+               name:      "MOVBstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -3990,10 +4029,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -4002,10 +4042,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreconstidx2",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreconstidx2",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -4014,10 +4055,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -4026,10 +4068,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreconstidx4",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreconstidx4",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 255},   // AX CX DX BX SP BP SI DI
@@ -4069,6 +4112,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 65519, // AX CX DX BX BP SI DI X0 X1 X2 X3 X4 X5 X6 X7
                },
@@ -4390,6 +4434,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4405,6 +4450,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4440,10 +4486,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4455,10 +4502,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSloadidx4",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSloadidx4",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4470,10 +4518,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4485,10 +4534,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDloadidx8",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDloadidx8",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4504,6 +4554,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4517,6 +4568,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4526,10 +4578,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4539,10 +4592,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSSstoreidx4",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSS,
+               name:      "MOVSSstoreidx4",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4552,10 +4606,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4565,10 +4620,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVSDstoreidx8",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVSD,
+               name:      "MOVSDstoreidx8",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVSD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -4583,6 +4639,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AADDSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4600,6 +4657,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AADDSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4617,6 +4675,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.ASUBSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4634,6 +4693,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.ASUBSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4651,6 +4711,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AMULSS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -4668,6 +4729,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                resultInArg0:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AMULSD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -5911,6 +5973,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AADDL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -5929,6 +5992,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AADDQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -5947,6 +6011,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.ASUBQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -5965,6 +6030,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.ASUBL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -5983,6 +6049,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AANDL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6001,6 +6068,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AANDQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6019,6 +6087,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AORQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6037,6 +6106,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AORL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6055,6 +6125,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AXORQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6073,6 +6144,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            x86.AXORL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6682,6 +6754,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               x86.ALEAQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6693,9 +6766,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAQ1",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAQ1",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6707,9 +6781,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAQ2",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAQ2",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6721,9 +6796,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAQ4",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAQ4",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6735,9 +6811,10 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "LEAQ8",
-               auxType: auxSymOff,
-               argLen:  2,
+               name:      "LEAQ8",
+               auxType:   auxSymOff,
+               argLen:    2,
+               symEffect: SymAddr,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6753,6 +6830,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               x86.ALEAL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6768,6 +6846,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVBLZX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6783,6 +6862,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVBQSX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6798,6 +6878,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6813,6 +6894,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVWQSX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6828,6 +6910,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6843,6 +6926,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVLQSX,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6858,6 +6942,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6873,6 +6958,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6886,6 +6972,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6899,6 +6986,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6912,6 +7000,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6925,6 +7014,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVUPS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6940,6 +7030,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVUPS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -6949,10 +7040,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVBLZX,
+               name:      "MOVBloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVBLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6964,10 +7056,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVWLZX,
+               name:      "MOVWloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6979,10 +7072,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWloadidx2",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVWLZX,
+               name:      "MOVWloadidx2",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVWLZX,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -6994,10 +7088,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7009,10 +7104,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLloadidx4",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLloadidx4",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7024,10 +7120,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQloadidx1",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVQ,
+               name:      "MOVQloadidx1",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7039,10 +7136,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQloadidx8",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     x86.AMOVQ,
+               name:      "MOVQloadidx8",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7054,10 +7152,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVB,
+               name:      "MOVBstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7067,10 +7166,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7080,10 +7180,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreidx2",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreidx2",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7093,10 +7194,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7106,10 +7208,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreidx4",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreidx4",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7119,10 +7222,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQstoreidx1",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVQ,
+               name:      "MOVQstoreidx1",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7132,10 +7236,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQstoreidx8",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     x86.AMOVQ,
+               name:      "MOVQstoreidx8",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7149,6 +7254,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7161,6 +7267,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7173,6 +7280,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7185,6 +7293,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymValAndOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7193,10 +7302,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVBstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVB,
+               name:      "MOVBstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7205,10 +7315,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7217,10 +7328,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVWstoreconstidx2",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVW,
+               name:      "MOVWstoreconstidx2",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7229,10 +7341,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7241,10 +7354,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVLstoreconstidx4",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVL,
+               name:      "MOVLstoreconstidx4",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7253,10 +7367,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQstoreconstidx1",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVQ,
+               name:      "MOVQstoreconstidx1",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7265,10 +7380,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "MOVQstoreconstidx8",
-               auxType: auxSymValAndOff,
-               argLen:  3,
-               asm:     x86.AMOVQ,
+               name:      "MOVQstoreconstidx8",
+               auxType:   auxSymValAndOff,
+               argLen:    3,
+               symEffect: SymWrite,
+               asm:       x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
                                {1, 65535},      // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
@@ -7320,6 +7436,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 4294967279, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15
                },
@@ -7471,6 +7588,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7486,6 +7604,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            x86.AMOVQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7503,6 +7622,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                faultOnNilArg1: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AXCHGL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7521,6 +7641,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                faultOnNilArg1: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AXCHGQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7540,6 +7661,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg1: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AXADDL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7559,6 +7681,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg1: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AXADDQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7587,6 +7710,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.ACMPXCHGL,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7608,6 +7732,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.ACMPXCHGQ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7629,6 +7754,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AANDB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7644,6 +7770,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            x86.AORB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -7788,6 +7915,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       2,
                clobberFlags: true,
+               symEffect:    SymNone,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 2}, // R1
@@ -9903,6 +10031,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               arm.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9918,6 +10047,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9933,6 +10063,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVBU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9948,6 +10079,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9963,6 +10095,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVHU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9978,6 +10111,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -9993,6 +10127,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10008,6 +10143,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10023,6 +10159,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10036,6 +10173,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10049,6 +10187,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10062,6 +10201,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10075,6 +10215,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -10459,6 +10600,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 4294924287, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 g R12 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
                },
@@ -11917,6 +12059,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               arm64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -11932,6 +12075,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -11947,6 +12091,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVBU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -11962,6 +12107,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -11977,6 +12123,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVHU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -11992,6 +12139,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12007,6 +12155,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVWU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12022,6 +12171,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12037,6 +12187,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12052,6 +12203,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            arm64.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12067,6 +12219,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12080,6 +12233,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12093,6 +12247,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12106,6 +12261,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12119,6 +12275,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12132,6 +12289,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12145,6 +12303,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12157,6 +12316,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12169,6 +12329,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12181,6 +12342,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            arm64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -12559,6 +12721,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 9223372035512336383, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 F0 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 F27 F28 F29 F30 F31
                },
@@ -13682,6 +13845,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13697,6 +13861,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13712,6 +13877,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVBU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13727,6 +13893,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13742,6 +13909,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVHU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13757,6 +13925,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13772,6 +13941,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13787,6 +13957,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13802,6 +13973,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13815,6 +13987,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13828,6 +14001,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13841,6 +14015,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13854,6 +14029,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13867,6 +14043,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13879,6 +14056,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -13891,6 +14069,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -14091,6 +14270,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 140737421246462, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R28 g R31 F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30 HI LO
                },
@@ -14965,6 +15145,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               mips.AMOVV,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -14980,6 +15161,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -14995,6 +15177,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVBU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15010,6 +15193,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15025,6 +15209,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVHU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15040,6 +15225,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15055,6 +15241,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVWU,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15070,6 +15257,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVV,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15085,6 +15273,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15100,6 +15289,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            mips.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15115,6 +15305,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15128,6 +15319,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15141,6 +15333,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15154,6 +15347,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVV,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15167,6 +15361,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVF,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15180,6 +15375,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15193,6 +15389,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15205,6 +15402,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15217,6 +15415,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15229,6 +15428,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            mips.AMOVV,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -15476,6 +15676,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 4611686018393833470, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 g R31 F0 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 F27 F28 F29 F30 F31 HI LO
                },
@@ -15617,10 +15818,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "ADDconst",
-               auxType: auxSymOff,
-               argLen:  1,
-               asm:     ppc64.AADD,
+               name:      "ADDconst",
+               auxType:   auxSymOff,
+               argLen:    1,
+               symEffect: SymAddr,
+               asm:       ppc64.AADD,
                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
@@ -16463,6 +16665,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVBZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16478,6 +16681,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16493,6 +16697,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVHZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16508,6 +16713,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16523,6 +16729,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVWZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16538,6 +16745,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16553,6 +16761,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16568,6 +16777,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            ppc64.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16583,6 +16793,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16596,6 +16807,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16609,6 +16821,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16622,6 +16835,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16635,6 +16849,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16648,6 +16863,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16661,6 +16877,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16673,6 +16890,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16685,6 +16903,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16697,6 +16916,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            ppc64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16709,6 +16929,7 @@ var opcodeTable = [...]opInfo{
                auxType:           auxSymOff,
                argLen:            1,
                rematerializeable: true,
+               symEffect:         SymAddr,
                asm:               ppc64.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -16985,6 +17206,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 576460745860964344, // 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 g 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
                },
@@ -17488,6 +17710,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17503,6 +17726,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17538,10 +17762,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "FMOVSloadidx",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     s390x.AFMOVS,
+               name:      "FMOVSloadidx",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       s390x.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 54270}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 SP
@@ -17553,10 +17778,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "FMOVDloadidx",
-               auxType: auxSymOff,
-               argLen:  3,
-               asm:     s390x.AFMOVD,
+               name:      "FMOVDloadidx",
+               auxType:   auxSymOff,
+               argLen:    3,
+               symEffect: SymRead,
+               asm:       s390x.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 54270}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 SP
@@ -17572,6 +17798,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17585,6 +17812,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         3,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17594,10 +17822,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "FMOVSstoreidx",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     s390x.AFMOVS,
+               name:      "FMOVSstoreidx",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       s390x.AFMOVS,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 54270},      // R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 SP
@@ -17607,10 +17836,11 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:    "FMOVDstoreidx",
-               auxType: auxSymOff,
-               argLen:  4,
-               asm:     s390x.AFMOVD,
+               name:      "FMOVDstoreidx",
+               auxType:   auxSymOff,
+               argLen:    4,
+               symEffect: SymWrite,
+               asm:       s390x.AFMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 54270},      // R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 SP
@@ -17688,6 +17918,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AADD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17706,6 +17937,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AADDW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17786,6 +18018,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.ASUB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17804,6 +18037,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.ASUBW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17888,6 +18122,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AMULLD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -17906,6 +18141,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AMULLW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18148,6 +18384,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AAND,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18166,6 +18403,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AANDW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18248,6 +18486,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AOR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18266,6 +18505,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AORW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18348,6 +18588,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AXOR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -18366,6 +18607,7 @@ var opcodeTable = [...]opInfo{
                resultInArg0:   true,
                clobberFlags:   true,
                faultOnNilArg1: true,
+               symEffect:      SymRead,
                asm:            s390x.AXORW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19148,6 +19390,7 @@ var opcodeTable = [...]opInfo{
                argLen:            1,
                rematerializeable: true,
                clobberFlags:      true,
+               symEffect:         SymRead,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 4295000064}, // SP SB
@@ -19162,6 +19405,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       2,
                clobberFlags: true,
+               symEffect:    SymRead,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 4295000064}, // SP SB
@@ -19178,6 +19422,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVBZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19194,6 +19439,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19210,6 +19456,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVHZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19226,6 +19473,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19242,6 +19490,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVWZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19258,6 +19507,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19274,6 +19524,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19316,6 +19567,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVHBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19332,6 +19584,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVWBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19348,6 +19601,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVDBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19364,6 +19618,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19378,6 +19633,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19392,6 +19648,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19406,6 +19663,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19420,6 +19678,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVHBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19434,6 +19693,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVWBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19448,6 +19708,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVDBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19463,6 +19724,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                faultOnNilArg1: true,
+               symEffect:      SymNone,
                asm:            s390x.AMVC,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19476,6 +19738,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVBZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19492,6 +19755,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVHZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19508,6 +19772,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVWZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19524,6 +19789,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19540,6 +19806,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVHBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19556,6 +19823,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVWBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19572,6 +19840,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       3,
                clobberFlags: true,
+               symEffect:    SymRead,
                asm:          s390x.AMOVDBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19588,6 +19857,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19602,6 +19872,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19616,6 +19887,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19630,6 +19902,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19644,6 +19917,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVHBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19658,6 +19932,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVWBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19672,6 +19947,7 @@ var opcodeTable = [...]opInfo{
                auxType:      auxSymOff,
                argLen:       4,
                clobberFlags: true,
+               symEffect:    SymWrite,
                asm:          s390x.AMOVDBR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19687,6 +19963,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVB,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19700,6 +19977,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVH,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19713,6 +19991,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19726,6 +20005,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19739,6 +20019,7 @@ var opcodeTable = [...]opInfo{
                argLen:         2,
                clobberFlags:   true,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ACLEAR,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19752,6 +20033,7 @@ var opcodeTable = [...]opInfo{
                argLen:       1,
                clobberFlags: true,
                call:         true,
+               symEffect:    SymNone,
                reg: regInfo{
                        clobbers: 4294923263, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
                },
@@ -19877,6 +20159,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVWZ,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19892,6 +20175,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         2,
                faultOnNilArg0: true,
+               symEffect:      SymRead,
                asm:            s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19909,6 +20193,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVW,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19924,6 +20209,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymWrite,
                asm:            s390x.AMOVD,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19938,6 +20224,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ALAA,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19955,6 +20242,7 @@ var opcodeTable = [...]opInfo{
                argLen:         3,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ALAAG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -19983,6 +20271,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ACS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20004,6 +20293,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ACSG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20025,6 +20315,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ACS,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20044,6 +20335,7 @@ var opcodeTable = [...]opInfo{
                clobberFlags:   true,
                faultOnNilArg0: true,
                hasSideEffects: true,
+               symEffect:      SymRdWr,
                asm:            s390x.ACSG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20076,6 +20368,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         4,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20090,6 +20383,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         5,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20105,6 +20399,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         6,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMG,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20121,6 +20416,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         4,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMY,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20135,6 +20431,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         5,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMY,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -20150,6 +20447,7 @@ var opcodeTable = [...]opInfo{
                auxType:        auxSymOff,
                argLen:         6,
                faultOnNilArg0: true,
+               symEffect:      SymWrite,
                asm:            s390x.ASTMY,
                reg: regInfo{
                        inputs: []inputInfo{
@@ -21231,16 +21529,18 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "Arg",
-               auxType: auxSymOff,
-               argLen:  0,
-               generic: true,
+               name:      "Arg",
+               auxType:   auxSymOff,
+               argLen:    0,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
-               name:    "Addr",
-               auxType: auxSym,
-               argLen:  1,
-               generic: true,
+               name:      "Addr",
+               auxType:   auxSym,
+               argLen:    1,
+               symEffect: SymAddr,
+               generic:   true,
        },
        {
                name:    "SP",
@@ -21253,10 +21553,11 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "Func",
-               auxType: auxSym,
-               argLen:  0,
-               generic: true,
+               name:      "Func",
+               auxType:   auxSym,
+               argLen:    0,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
                name:    "Load",
@@ -21288,16 +21589,18 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "MoveWB",
-               auxType: auxSymSizeAndAlign,
-               argLen:  3,
-               generic: true,
+               name:      "MoveWB",
+               auxType:   auxSymSizeAndAlign,
+               argLen:    3,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
-               name:    "ZeroWB",
-               auxType: auxSymSizeAndAlign,
-               argLen:  2,
-               generic: true,
+               name:      "ZeroWB",
+               auxType:   auxSymSizeAndAlign,
+               argLen:    2,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
                name:    "ClosureCall",
@@ -21307,11 +21610,12 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "StaticCall",
-               auxType: auxSymOff,
-               argLen:  1,
-               call:    true,
-               generic: true,
+               name:      "StaticCall",
+               auxType:   auxSymOff,
+               argLen:    1,
+               call:      true,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
                name:    "InterCall",
@@ -21634,10 +21938,11 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "FwdRef",
-               auxType: auxSym,
-               argLen:  0,
-               generic: true,
+               name:      "FwdRef",
+               auxType:   auxSym,
+               argLen:    0,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
                name:    "Unknown",
@@ -21645,22 +21950,25 @@ var opcodeTable = [...]opInfo{
                generic: true,
        },
        {
-               name:    "VarDef",
-               auxType: auxSym,
-               argLen:  1,
-               generic: true,
+               name:      "VarDef",
+               auxType:   auxSym,
+               argLen:    1,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
-               name:    "VarKill",
-               auxType: auxSym,
-               argLen:  1,
-               generic: true,
+               name:      "VarKill",
+               auxType:   auxSym,
+               argLen:    1,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
-               name:    "VarLive",
-               auxType: auxSym,
-               argLen:  1,
-               generic: true,
+               name:      "VarLive",
+               auxType:   auxSym,
+               argLen:    1,
+               symEffect: SymNone,
+               generic:   true,
        },
        {
                name:    "KeepAlive",