]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal, cmd/internal/obj: used keyed ProgInfo literals
authorBrad Fitzpatrick <bradfitz@golang.org>
Sat, 30 May 2015 22:08:46 +0000 (15:08 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 21 Aug 2015 22:32:43 +0000 (22:32 +0000)
Safer, more readable, shorter.

Change-Id: I5cf1f438e20a3df45fc43cc5c870a533f7c524bf
Reviewed-on: https://go-review.googlesource.com/10517
Reviewed-by: Minux Ma <minux@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/amd64/prog.go
src/cmd/compile/internal/arm/prog.go
src/cmd/compile/internal/arm64/prog.go
src/cmd/compile/internal/ppc64/prog.go
src/cmd/compile/internal/x86/prog.go
src/cmd/internal/obj/link.go

index 00918c869185d21e86c551a0e318ff9879721be7..5f4fe1c5abb4fb0756c4aa203e2ab287db0fb08d 100644 (file)
@@ -25,227 +25,227 @@ const (
 //
 // The table is formatted for 8-space tabs.
 var progtable = [x86.ALAST]obj.ProgInfo{
-       obj.ATYPE:     {gc.Pseudo | gc.Skip, 0, 0, 0},
-       obj.ATEXT:     {gc.Pseudo, 0, 0, 0},
-       obj.AFUNCDATA: {gc.Pseudo, 0, 0, 0},
-       obj.APCDATA:   {gc.Pseudo, 0, 0, 0},
-       obj.AUNDEF:    {gc.Break, 0, 0, 0},
-       obj.AUSEFIELD: {gc.OK, 0, 0, 0},
-       obj.ACHECKNIL: {gc.LeftRead, 0, 0, 0},
-       obj.AVARDEF:   {gc.Pseudo | gc.RightWrite, 0, 0, 0},
-       obj.AVARKILL:  {gc.Pseudo | gc.RightWrite, 0, 0, 0},
+       obj.ATYPE:     {Flags: gc.Pseudo | gc.Skip},
+       obj.ATEXT:     {Flags: gc.Pseudo},
+       obj.AFUNCDATA: {Flags: gc.Pseudo},
+       obj.APCDATA:   {Flags: gc.Pseudo},
+       obj.AUNDEF:    {Flags: gc.Break},
+       obj.AUSEFIELD: {Flags: gc.OK},
+       obj.ACHECKNIL: {Flags: gc.LeftRead},
+       obj.AVARDEF:   {Flags: gc.Pseudo | gc.RightWrite},
+       obj.AVARKILL:  {Flags: gc.Pseudo | gc.RightWrite},
 
        // NOP is an internal no-op that also stands
        // for USED and SET annotations, not the Intel opcode.
-       obj.ANOP:       {gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       x86.AADCL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AADCQ:      {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AADCW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AADDB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDQ:      {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDSD:     {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AADDSS:     {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AANDB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AANDL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AANDQ:      {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AANDW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       obj.ACALL:      {gc.RightAddr | gc.Call | gc.KillCarry, 0, 0, 0},
-       x86.ACDQ:       {gc.OK, AX, AX | DX, 0},
-       x86.ACQO:       {gc.OK, AX, AX | DX, 0},
-       x86.ACWD:       {gc.OK, AX, AX | DX, 0},
-       x86.ACLD:       {gc.OK, 0, 0, 0},
-       x86.ASTD:       {gc.OK, 0, 0, 0},
-       x86.ACMPB:      {gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACMPL:      {gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACMPQ:      {gc.SizeQ | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACMPW:      {gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACOMISD:    {gc.SizeD | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACOMISS:    {gc.SizeF | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACVTSD2SL:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSD2SQ:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSD2SS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSL2SD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSL2SS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSQ2SD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSQ2SS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSS2SD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSS2SL:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSS2SQ:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSD2SL: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSD2SQ: {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSS2SL: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSS2SQ: {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ADECB:      {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.ADECL:      {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.ADECQ:      {gc.SizeQ | RightRdwr, 0, 0, 0},
-       x86.ADECW:      {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.ADIVB:      {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.ADIVL:      {gc.SizeL | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.ADIVQ:      {gc.SizeQ | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.ADIVW:      {gc.SizeW | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.ADIVSD:     {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ADIVSS:     {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AIDIVB:     {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AIDIVL:     {gc.SizeL | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.AIDIVQ:     {gc.SizeQ | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.AIDIVW:     {gc.SizeW | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.AIMULB:     {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AIMULL:     {gc.SizeL | gc.LeftRead | gc.ImulAXDX | gc.SetCarry, 0, 0, 0},
-       x86.AIMULQ:     {gc.SizeQ | gc.LeftRead | gc.ImulAXDX | gc.SetCarry, 0, 0, 0},
-       x86.AIMULW:     {gc.SizeW | gc.LeftRead | gc.ImulAXDX | gc.SetCarry, 0, 0, 0},
-       x86.AINCB:      {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.AINCL:      {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.AINCQ:      {gc.SizeQ | RightRdwr, 0, 0, 0},
-       x86.AINCW:      {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.AJCC:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJCS:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJEQ:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJGE:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJGT:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJHI:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLE:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLS:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLT:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJMI:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJNE:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJOC:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJOS:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPC:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPL:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPS:       {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       obj.AJMP:       {gc.Jump | gc.Break | gc.KillCarry, 0, 0, 0},
-       x86.ALEAL:      {gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.ALEAQ:      {gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AMOVBLSX:   {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBLZX:   {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBQSX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBQZX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBWSX:   {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBWZX:   {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVLQSX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVLQZX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWLSX:   {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWLZX:   {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWQSX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWQZX:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVQL:     {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVB:      {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVL:      {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVQ:      {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVW:      {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVSB:     {gc.OK, DI | SI, DI | SI, 0},
-       x86.AMOVSL:     {gc.OK, DI | SI, DI | SI, 0},
-       x86.AMOVSQ:     {gc.OK, DI | SI, DI | SI, 0},
-       x86.AMOVSW:     {gc.OK, DI | SI, DI | SI, 0},
-       obj.ADUFFCOPY:  {gc.OK, DI | SI, DI | SI | CX, 0},
-       x86.AMOVSD:     {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVSS:     {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
+       obj.ANOP:       {Flags: gc.LeftRead | gc.RightWrite},
+       x86.AADCL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.AADCQ:      {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.AADCW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.AADDB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDQ:      {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDSD:     {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.AADDSS:     {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.AANDB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AANDL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AANDQ:      {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AANDW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       obj.ACALL:      {Flags: gc.RightAddr | gc.Call | gc.KillCarry},
+       x86.ACDQ:       {Flags: gc.OK, Reguse: AX, Regset: AX | DX},
+       x86.ACQO:       {Flags: gc.OK, Reguse: AX, Regset: AX | DX},
+       x86.ACWD:       {Flags: gc.OK, Reguse: AX, Regset: AX | DX},
+       x86.ACLD:       {Flags: gc.OK},
+       x86.ASTD:       {Flags: gc.OK},
+       x86.ACMPB:      {Flags: gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACMPL:      {Flags: gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACMPQ:      {Flags: gc.SizeQ | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACMPW:      {Flags: gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACOMISD:    {Flags: gc.SizeD | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACOMISS:    {Flags: gc.SizeF | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACVTSD2SL:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSD2SQ:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSD2SS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSL2SD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSL2SS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSQ2SD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSQ2SS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSS2SD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSS2SL:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSS2SQ:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSD2SL: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSD2SQ: {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSS2SL: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSS2SQ: {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ADECB:      {Flags: gc.SizeB | RightRdwr},
+       x86.ADECL:      {Flags: gc.SizeL | RightRdwr},
+       x86.ADECQ:      {Flags: gc.SizeQ | RightRdwr},
+       x86.ADECW:      {Flags: gc.SizeW | RightRdwr},
+       x86.ADIVB:      {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.ADIVL:      {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.ADIVQ:      {Flags: gc.SizeQ | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.ADIVW:      {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.ADIVSD:     {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.ADIVSS:     {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.AIDIVB:     {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AIDIVL:     {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.AIDIVQ:     {Flags: gc.SizeQ | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.AIDIVW:     {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.AIMULB:     {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AIMULL:     {Flags: gc.SizeL | gc.LeftRead | gc.ImulAXDX | gc.SetCarry},
+       x86.AIMULQ:     {Flags: gc.SizeQ | gc.LeftRead | gc.ImulAXDX | gc.SetCarry},
+       x86.AIMULW:     {Flags: gc.SizeW | gc.LeftRead | gc.ImulAXDX | gc.SetCarry},
+       x86.AINCB:      {Flags: gc.SizeB | RightRdwr},
+       x86.AINCL:      {Flags: gc.SizeL | RightRdwr},
+       x86.AINCQ:      {Flags: gc.SizeQ | RightRdwr},
+       x86.AINCW:      {Flags: gc.SizeW | RightRdwr},
+       x86.AJCC:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJCS:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJEQ:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJGE:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJGT:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJHI:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLE:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLS:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLT:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJMI:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJNE:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJOC:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJOS:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPC:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPL:       {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPS:       {Flags: gc.Cjmp | gc.UseCarry},
+       obj.AJMP:       {Flags: gc.Jump | gc.Break | gc.KillCarry},
+       x86.ALEAL:      {Flags: gc.LeftAddr | gc.RightWrite},
+       x86.ALEAQ:      {Flags: gc.LeftAddr | gc.RightWrite},
+       x86.AMOVBLSX:   {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBLZX:   {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBQSX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBQZX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBWSX:   {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBWZX:   {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVLQSX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVLQZX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWLSX:   {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWLZX:   {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWQSX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWQZX:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVQL:     {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVB:      {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVL:      {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVQ:      {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVW:      {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVSB:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       x86.AMOVSL:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       x86.AMOVSQ:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       x86.AMOVSW:     {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       obj.ADUFFCOPY:  {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI | CX},
+       x86.AMOVSD:     {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVSS:     {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move},
 
        // We use MOVAPD as a faster synonym for MOVSD.
-       x86.AMOVAPD:   {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMULB:     {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AMULL:     {gc.SizeL | gc.LeftRead | gc.SetCarry, AX, AX | DX, 0},
-       x86.AMULQ:     {gc.SizeQ | gc.LeftRead | gc.SetCarry, AX, AX | DX, 0},
-       x86.AMULW:     {gc.SizeW | gc.LeftRead | gc.SetCarry, AX, AX | DX, 0},
-       x86.AMULSD:    {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AMULSS:    {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ANEGB:     {gc.SizeB | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANEGL:     {gc.SizeL | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANEGQ:     {gc.SizeQ | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANEGW:     {gc.SizeW | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANOTB:     {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.ANOTL:     {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.ANOTQ:     {gc.SizeQ | RightRdwr, 0, 0, 0},
-       x86.ANOTW:     {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.AORB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AORL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AORQ:      {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AORW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.APOPQ:     {gc.SizeQ | gc.RightWrite, 0, 0, 0},
-       x86.APUSHQ:    {gc.SizeQ | gc.LeftRead, 0, 0, 0},
-       x86.ARCLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCLQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AREP:      {gc.OK, CX, CX, 0},
-       x86.AREPN:     {gc.OK, CX, CX, 0},
-       obj.ARET:      {gc.Break | gc.KillCarry, 0, 0, 0},
-       x86.AROLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.AROLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.AROLQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.AROLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASBBB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASBBL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASBBQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASBBW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASETCC:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETCS:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETEQ:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETGE:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETGT:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETHI:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETLE:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETLS:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETLT:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETMI:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETNE:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETOC:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETOS:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETPC:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETPL:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASETPS:    {gc.SizeB | gc.RightWrite | gc.UseCarry, 0, 0, 0},
-       x86.ASHLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHLQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASQRTSD:   {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ASTOSB:    {gc.OK, AX | DI, DI, 0},
-       x86.ASTOSL:    {gc.OK, AX | DI, DI, 0},
-       x86.ASTOSQ:    {gc.OK, AX | DI, DI, 0},
-       x86.ASTOSW:    {gc.OK, AX | DI, DI, 0},
-       obj.ADUFFZERO: {gc.OK, AX | DI, DI, 0},
-       x86.ASUBB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBSD:    {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ASUBSS:    {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ATESTB:    {gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ATESTL:    {gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ATESTQ:    {gc.SizeQ | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ATESTW:    {gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.AUCOMISD:  {gc.SizeD | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       x86.AUCOMISS:  {gc.SizeF | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       x86.AXCHGB:    {gc.SizeB | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXCHGL:    {gc.SizeL | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXCHGQ:    {gc.SizeQ | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXCHGW:    {gc.SizeW | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXORB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AXORL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AXORQ:     {gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AXORW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
+       x86.AMOVAPD:   {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMULB:     {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AMULL:     {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX | DX},
+       x86.AMULQ:     {Flags: gc.SizeQ | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX | DX},
+       x86.AMULW:     {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX | DX},
+       x86.AMULSD:    {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.AMULSS:    {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.ANEGB:     {Flags: gc.SizeB | RightRdwr | gc.SetCarry},
+       x86.ANEGL:     {Flags: gc.SizeL | RightRdwr | gc.SetCarry},
+       x86.ANEGQ:     {Flags: gc.SizeQ | RightRdwr | gc.SetCarry},
+       x86.ANEGW:     {Flags: gc.SizeW | RightRdwr | gc.SetCarry},
+       x86.ANOTB:     {Flags: gc.SizeB | RightRdwr},
+       x86.ANOTL:     {Flags: gc.SizeL | RightRdwr},
+       x86.ANOTQ:     {Flags: gc.SizeQ | RightRdwr},
+       x86.ANOTW:     {Flags: gc.SizeW | RightRdwr},
+       x86.AORB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AORL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AORQ:      {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AORW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.APOPQ:     {Flags: gc.SizeQ | gc.RightWrite},
+       x86.APUSHQ:    {Flags: gc.SizeQ | gc.LeftRead},
+       x86.ARCLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCLQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.AREP:      {Flags: gc.OK, Reguse: CX, Regset: CX},
+       x86.AREPN:     {Flags: gc.OK, Reguse: CX, Regset: CX},
+       obj.ARET:      {Flags: gc.Break | gc.KillCarry},
+       x86.AROLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.AROLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.AROLQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.AROLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASBBB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASBBL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASBBQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASBBW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASETCC:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETCS:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETEQ:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETGE:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETGT:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETHI:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETLE:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETLS:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETLT:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETMI:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETNE:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETOC:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETOS:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETPC:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETPL:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASETPS:    {Flags: gc.SizeB | gc.RightWrite | gc.UseCarry},
+       x86.ASHLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHLQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASQRTSD:   {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.ASTOSB:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASTOSL:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASTOSQ:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASTOSW:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       obj.ADUFFZERO: {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASUBB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBSD:    {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.ASUBSS:    {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.ATESTB:    {Flags: gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ATESTL:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ATESTQ:    {Flags: gc.SizeQ | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ATESTW:    {Flags: gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.AUCOMISD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightRead},
+       x86.AUCOMISS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightRead},
+       x86.AXCHGB:    {Flags: gc.SizeB | LeftRdwr | RightRdwr},
+       x86.AXCHGL:    {Flags: gc.SizeL | LeftRdwr | RightRdwr},
+       x86.AXCHGQ:    {Flags: gc.SizeQ | LeftRdwr | RightRdwr},
+       x86.AXCHGW:    {Flags: gc.SizeW | LeftRdwr | RightRdwr},
+       x86.AXORB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AXORL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AXORQ:     {Flags: gc.SizeQ | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AXORW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
 }
 
 func progflags(p *obj.Prog) uint32 {
index cdf9d29192ac4ccbec26f1ae10fe6bd56269c100..9dcec46ba46bef441d5e82d9d9956ef48fe15535 100644 (file)
@@ -24,114 +24,114 @@ const (
 //
 // The table is formatted for 8-space tabs.
 var progtable = [arm.ALAST]obj.ProgInfo{
-       obj.ATYPE:     {gc.Pseudo | gc.Skip, 0, 0, 0},
-       obj.ATEXT:     {gc.Pseudo, 0, 0, 0},
-       obj.AFUNCDATA: {gc.Pseudo, 0, 0, 0},
-       obj.APCDATA:   {gc.Pseudo, 0, 0, 0},
-       obj.AUNDEF:    {gc.Break, 0, 0, 0},
-       obj.AUSEFIELD: {gc.OK, 0, 0, 0},
-       obj.ACHECKNIL: {gc.LeftRead, 0, 0, 0},
-       obj.AVARDEF:   {gc.Pseudo | gc.RightWrite, 0, 0, 0},
-       obj.AVARKILL:  {gc.Pseudo | gc.RightWrite, 0, 0, 0},
+       obj.ATYPE:     {Flags: gc.Pseudo | gc.Skip},
+       obj.ATEXT:     {Flags: gc.Pseudo},
+       obj.AFUNCDATA: {Flags: gc.Pseudo},
+       obj.APCDATA:   {Flags: gc.Pseudo},
+       obj.AUNDEF:    {Flags: gc.Break},
+       obj.AUSEFIELD: {Flags: gc.OK},
+       obj.ACHECKNIL: {Flags: gc.LeftRead},
+       obj.AVARDEF:   {Flags: gc.Pseudo | gc.RightWrite},
+       obj.AVARKILL:  {Flags: gc.Pseudo | gc.RightWrite},
 
        // NOP is an internal no-op that also stands
        // for USED and SET annotations, not the Intel opcode.
-       obj.ANOP: {gc.LeftRead | gc.RightWrite, 0, 0, 0},
+       obj.ANOP: {Flags: gc.LeftRead | gc.RightWrite},
 
        // Integer.
-       arm.AADC:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AADD:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AAND:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ABIC:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ACMN:    {gc.SizeL | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       arm.ACMP:    {gc.SizeL | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       arm.ADIVU:   {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ADIV:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AEOR:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMODU:   {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMOD:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMULALU: {gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr, 0, 0, 0},
-       arm.AMULAL:  {gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr, 0, 0, 0},
-       arm.AMULA:   {gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr, 0, 0, 0},
-       arm.AMULU:   {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMUL:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMULL:   {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMULLU:  {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.AMVN:    {gc.SizeL | gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       arm.AORR:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ARSB:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ARSC:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ASBC:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ASLL:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ASRA:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ASRL:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ASUB:    {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm.ATEQ:    {gc.SizeL | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       arm.ATST:    {gc.SizeL | gc.LeftRead | gc.RightRead, 0, 0, 0},
+       arm.AADC:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AADD:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AAND:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ABIC:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ACMN:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead},
+       arm.ACMP:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead},
+       arm.ADIVU:   {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ADIV:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AEOR:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMODU:   {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMOD:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMULALU: {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr},
+       arm.AMULAL:  {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr},
+       arm.AMULA:   {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | RightRdwr},
+       arm.AMULU:   {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMUL:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMULL:   {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMULLU:  {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.AMVN:    {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite},
+       arm.AORR:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ARSB:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ARSC:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ASBC:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ASLL:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ASRA:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ASRL:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ASUB:    {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm.ATEQ:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead},
+       arm.ATST:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead},
 
        // Floating point.
-       arm.AADDD:  {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.AADDF:  {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.ACMPD:  {gc.SizeD | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       arm.ACMPF:  {gc.SizeF | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       arm.ADIVD:  {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.ADIVF:  {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.AMULD:  {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.AMULF:  {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.ASUBD:  {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.ASUBF:  {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       arm.ASQRTD: {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
+       arm.AADDD:  {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       arm.AADDF:  {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       arm.ACMPD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightRead},
+       arm.ACMPF:  {Flags: gc.SizeF | gc.LeftRead | gc.RightRead},
+       arm.ADIVD:  {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       arm.ADIVF:  {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       arm.AMULD:  {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       arm.AMULF:  {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       arm.ASUBD:  {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       arm.ASUBF:  {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       arm.ASQRTD: {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
 
        // Conversions.
-       arm.AMOVWD: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVWF: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVDF: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVDW: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVFD: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVFW: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       arm.AMOVWD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVWF: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVDF: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVDW: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVFD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVFW: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // Moves.
-       arm.AMOVB: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       arm.AMOVD: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       arm.AMOVF: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       arm.AMOVH: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       arm.AMOVW: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
+       arm.AMOVB: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move},
+       arm.AMOVD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
+       arm.AMOVF: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move},
+       arm.AMOVH: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move},
+       arm.AMOVW: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move},
 
        // In addtion, duffzero reads R0,R1 and writes R1.  This fact is
        // encoded in peep.c
-       obj.ADUFFZERO: {gc.Call, 0, 0, 0},
+       obj.ADUFFZERO: {Flags: gc.Call},
 
        // In addtion, duffcopy reads R1,R2 and writes R0,R1,R2.  This fact is
        // encoded in peep.c
-       obj.ADUFFCOPY: {gc.Call, 0, 0, 0},
+       obj.ADUFFCOPY: {Flags: gc.Call},
 
        // These should be split into the two different conversions instead
        // of overloading the one.
-       arm.AMOVBS: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVBU: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVHS: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm.AMOVHU: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       arm.AMOVBS: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVBU: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVHS: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm.AMOVHU: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // Jumps.
-       arm.AB:   {gc.Jump | gc.Break, 0, 0, 0},
-       arm.ABL:  {gc.Call, 0, 0, 0},
-       arm.ABEQ: {gc.Cjmp, 0, 0, 0},
-       arm.ABNE: {gc.Cjmp, 0, 0, 0},
-       arm.ABCS: {gc.Cjmp, 0, 0, 0},
-       arm.ABHS: {gc.Cjmp, 0, 0, 0},
-       arm.ABCC: {gc.Cjmp, 0, 0, 0},
-       arm.ABLO: {gc.Cjmp, 0, 0, 0},
-       arm.ABMI: {gc.Cjmp, 0, 0, 0},
-       arm.ABPL: {gc.Cjmp, 0, 0, 0},
-       arm.ABVS: {gc.Cjmp, 0, 0, 0},
-       arm.ABVC: {gc.Cjmp, 0, 0, 0},
-       arm.ABHI: {gc.Cjmp, 0, 0, 0},
-       arm.ABLS: {gc.Cjmp, 0, 0, 0},
-       arm.ABGE: {gc.Cjmp, 0, 0, 0},
-       arm.ABLT: {gc.Cjmp, 0, 0, 0},
-       arm.ABGT: {gc.Cjmp, 0, 0, 0},
-       arm.ABLE: {gc.Cjmp, 0, 0, 0},
-       obj.ARET: {gc.Break, 0, 0, 0},
+       arm.AB:   {Flags: gc.Jump | gc.Break},
+       arm.ABL:  {Flags: gc.Call},
+       arm.ABEQ: {Flags: gc.Cjmp},
+       arm.ABNE: {Flags: gc.Cjmp},
+       arm.ABCS: {Flags: gc.Cjmp},
+       arm.ABHS: {Flags: gc.Cjmp},
+       arm.ABCC: {Flags: gc.Cjmp},
+       arm.ABLO: {Flags: gc.Cjmp},
+       arm.ABMI: {Flags: gc.Cjmp},
+       arm.ABPL: {Flags: gc.Cjmp},
+       arm.ABVS: {Flags: gc.Cjmp},
+       arm.ABVC: {Flags: gc.Cjmp},
+       arm.ABHI: {Flags: gc.Cjmp},
+       arm.ABLS: {Flags: gc.Cjmp},
+       arm.ABGE: {Flags: gc.Cjmp},
+       arm.ABLT: {Flags: gc.Cjmp},
+       arm.ABGT: {Flags: gc.Cjmp},
+       arm.ABLE: {Flags: gc.Cjmp},
+       obj.ARET: {Flags: gc.Break},
 }
 
 func proginfo(p *obj.Prog) {
index 1106e788a53141bc98672f9d76df157118a28a6e..4b498b77981801bf7363c77c9cf3fc9545131c77 100644 (file)
@@ -25,108 +25,108 @@ const (
 //
 // The table is formatted for 8-space tabs.
 var progtable = [arm64.ALAST]obj.ProgInfo{
-       obj.ATYPE:     {gc.Pseudo | gc.Skip, 0, 0, 0},
-       obj.ATEXT:     {gc.Pseudo, 0, 0, 0},
-       obj.AFUNCDATA: {gc.Pseudo, 0, 0, 0},
-       obj.APCDATA:   {gc.Pseudo, 0, 0, 0},
-       obj.AUNDEF:    {gc.Break, 0, 0, 0},
-       obj.AUSEFIELD: {gc.OK, 0, 0, 0},
-       obj.ACHECKNIL: {gc.LeftRead, 0, 0, 0},
-       obj.AVARDEF:   {gc.Pseudo | gc.RightWrite, 0, 0, 0},
-       obj.AVARKILL:  {gc.Pseudo | gc.RightWrite, 0, 0, 0},
+       obj.ATYPE:     {Flags: gc.Pseudo | gc.Skip},
+       obj.ATEXT:     {Flags: gc.Pseudo},
+       obj.AFUNCDATA: {Flags: gc.Pseudo},
+       obj.APCDATA:   {Flags: gc.Pseudo},
+       obj.AUNDEF:    {Flags: gc.Break},
+       obj.AUSEFIELD: {Flags: gc.OK},
+       obj.ACHECKNIL: {Flags: gc.LeftRead},
+       obj.AVARDEF:   {Flags: gc.Pseudo | gc.RightWrite},
+       obj.AVARKILL:  {Flags: gc.Pseudo | gc.RightWrite},
 
        // NOP is an internal no-op that also stands
        // for USED and SET annotations, not the Power opcode.
-       obj.ANOP:    {gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       arm64.AHINT: {gc.OK, 0, 0, 0},
+       obj.ANOP:    {Flags: gc.LeftRead | gc.RightWrite},
+       arm64.AHINT: {Flags: gc.OK},
 
        // Integer
-       arm64.AADD:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ASUB:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ANEG:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AAND:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AORR:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AEOR:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AMUL:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ASMULL: {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AUMULL: {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ASMULH: {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AUMULH: {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ASDIV:  {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AUDIV:  {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ALSL:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ALSR:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AASR:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.ACMP:   {gc.SizeQ | gc.LeftRead | gc.RegRead, 0, 0, 0},
+       arm64.AADD:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ASUB:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ANEG:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AAND:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AORR:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AEOR:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AMUL:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ASMULL: {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AUMULL: {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ASMULH: {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AUMULH: {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ASDIV:  {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AUDIV:  {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ALSL:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ALSR:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AASR:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.ACMP:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead},
 
        // Floating point.
-       arm64.AFADDD:  {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFADDS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFSUBD:  {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFSUBS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFNEGD:  {gc.SizeD | gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFNEGS:  {gc.SizeF | gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFSQRTD: {gc.SizeD | gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFMULD:  {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFMULS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFDIVD:  {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFDIVS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       arm64.AFCMPD:  {gc.SizeD | gc.LeftRead | gc.RegRead, 0, 0, 0},
-       arm64.AFCMPS:  {gc.SizeF | gc.LeftRead | gc.RegRead, 0, 0, 0},
+       arm64.AFADDD:  {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFADDS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFSUBD:  {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFSUBS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFNEGD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite},
+       arm64.AFNEGS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite},
+       arm64.AFSQRTD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite},
+       arm64.AFMULD:  {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFMULS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFDIVD:  {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFDIVS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       arm64.AFCMPD:  {Flags: gc.SizeD | gc.LeftRead | gc.RegRead},
+       arm64.AFCMPS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead},
 
        // float -> integer
-       arm64.AFCVTZSD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZSS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZSDW: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZSSW: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZUD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZUS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZUDW: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTZUSW: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       arm64.AFCVTZSD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZSS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZSDW: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZSSW: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZUD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZUS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZUDW: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTZUSW: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // float -> float
-       arm64.AFCVTSD: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AFCVTDS: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       arm64.AFCVTSD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AFCVTDS: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // integer -> float
-       arm64.ASCVTFD:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.ASCVTFS:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.ASCVTFWD: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.ASCVTFWS: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AUCVTFD:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AUCVTFS:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AUCVTFWD: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       arm64.AUCVTFWS: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       arm64.ASCVTFD:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.ASCVTFS:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.ASCVTFWD: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.ASCVTFWS: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AUCVTFD:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AUCVTFS:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AUCVTFWD: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       arm64.AUCVTFWS: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // Moves
-       arm64.AMOVB:  {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVBU: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVH:  {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVHU: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVW:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVWU: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AMOVD:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       arm64.AFMOVS: {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       arm64.AFMOVD: {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
+       arm64.AMOVB:  {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVBU: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVH:  {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVHU: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVW:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVWU: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AMOVD:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move},
+       arm64.AFMOVS: {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       arm64.AFMOVD: {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
 
        // Jumps
-       arm64.AB:      {gc.Jump | gc.Break, 0, 0, 0},
-       arm64.ABL:     {gc.Call, 0, 0, 0},
-       arm64.ABEQ:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABNE:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABGE:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABLT:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABGT:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABLE:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABLO:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABLS:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABHI:    {gc.Cjmp, 0, 0, 0},
-       arm64.ABHS:    {gc.Cjmp, 0, 0, 0},
-       arm64.ACBZ:    {gc.Cjmp, 0, 0, 0},
-       arm64.ACBNZ:   {gc.Cjmp, 0, 0, 0},
-       obj.ARET:      {gc.Break, 0, 0, 0},
-       obj.ADUFFZERO: {gc.Call, 0, 0, 0},
-       obj.ADUFFCOPY: {gc.Call, 0, 0, 0},
+       arm64.AB:      {Flags: gc.Jump | gc.Break},
+       arm64.ABL:     {Flags: gc.Call},
+       arm64.ABEQ:    {Flags: gc.Cjmp},
+       arm64.ABNE:    {Flags: gc.Cjmp},
+       arm64.ABGE:    {Flags: gc.Cjmp},
+       arm64.ABLT:    {Flags: gc.Cjmp},
+       arm64.ABGT:    {Flags: gc.Cjmp},
+       arm64.ABLE:    {Flags: gc.Cjmp},
+       arm64.ABLO:    {Flags: gc.Cjmp},
+       arm64.ABLS:    {Flags: gc.Cjmp},
+       arm64.ABHI:    {Flags: gc.Cjmp},
+       arm64.ABHS:    {Flags: gc.Cjmp},
+       arm64.ACBZ:    {Flags: gc.Cjmp},
+       arm64.ACBNZ:   {Flags: gc.Cjmp},
+       obj.ARET:      {Flags: gc.Break},
+       obj.ADUFFZERO: {Flags: gc.Call},
+       obj.ADUFFCOPY: {Flags: gc.Call},
 }
 
 func proginfo(p *obj.Prog) {
index 328b2ce0cf3cc685f52c989667ce1334285ae062..406f23571f610381b4541dbe41b9d809b59d9f2f 100644 (file)
@@ -25,83 +25,83 @@ const (
 //
 // The table is formatted for 8-space tabs.
 var progtable = [ppc64.ALAST]obj.ProgInfo{
-       obj.ATYPE:     {gc.Pseudo | gc.Skip, 0, 0, 0},
-       obj.ATEXT:     {gc.Pseudo, 0, 0, 0},
-       obj.AFUNCDATA: {gc.Pseudo, 0, 0, 0},
-       obj.APCDATA:   {gc.Pseudo, 0, 0, 0},
-       obj.AUNDEF:    {gc.Break, 0, 0, 0},
-       obj.AUSEFIELD: {gc.OK, 0, 0, 0},
-       obj.ACHECKNIL: {gc.LeftRead, 0, 0, 0},
-       obj.AVARDEF:   {gc.Pseudo | gc.RightWrite, 0, 0, 0},
-       obj.AVARKILL:  {gc.Pseudo | gc.RightWrite, 0, 0, 0},
+       obj.ATYPE:     {Flags: gc.Pseudo | gc.Skip},
+       obj.ATEXT:     {Flags: gc.Pseudo},
+       obj.AFUNCDATA: {Flags: gc.Pseudo},
+       obj.APCDATA:   {Flags: gc.Pseudo},
+       obj.AUNDEF:    {Flags: gc.Break},
+       obj.AUSEFIELD: {Flags: gc.OK},
+       obj.ACHECKNIL: {Flags: gc.LeftRead},
+       obj.AVARDEF:   {Flags: gc.Pseudo | gc.RightWrite},
+       obj.AVARKILL:  {Flags: gc.Pseudo | gc.RightWrite},
 
        // NOP is an internal no-op that also stands
        // for USED and SET annotations, not the Power opcode.
-       obj.ANOP: {gc.LeftRead | gc.RightWrite, 0, 0, 0},
+       obj.ANOP: {Flags: gc.LeftRead | gc.RightWrite},
 
        // Integer
-       ppc64.AADD:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ASUB:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ANEG:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AAND:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AOR:     {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AXOR:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AMULLD:  {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AMULLW:  {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AMULHD:  {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AMULHDU: {gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ADIVD:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ADIVDU:  {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ASLD:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ASRD:    {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ASRAD:   {gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.ACMP:    {gc.SizeQ | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       ppc64.ACMPU:   {gc.SizeQ | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       ppc64.ATD:     {gc.SizeQ | gc.RightRead, 0, 0, 0},
+       ppc64.AADD:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ASUB:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ANEG:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AAND:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AOR:     {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AXOR:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AMULLD:  {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AMULLW:  {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AMULHD:  {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AMULHDU: {Flags: gc.SizeL | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ADIVD:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ADIVDU:  {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ASLD:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ASRD:    {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ASRAD:   {Flags: gc.SizeQ | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.ACMP:    {Flags: gc.SizeQ | gc.LeftRead | gc.RightRead},
+       ppc64.ACMPU:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightRead},
+       ppc64.ATD:     {Flags: gc.SizeQ | gc.RightRead},
 
        // Floating point.
-       ppc64.AFADD:   {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFADDS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFSUB:   {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFSUBS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFMUL:   {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFMULS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFDIV:   {gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFDIVS:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFCTIDZ: {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFCFID:  {gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite, 0, 0, 0},
-       ppc64.AFCMPU:  {gc.SizeD | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       ppc64.AFRSP:   {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
+       ppc64.AFADD:   {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFADDS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFSUB:   {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFSUBS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFMUL:   {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFMULS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFDIV:   {Flags: gc.SizeD | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFDIVS:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFCTIDZ: {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFCFID:  {Flags: gc.SizeF | gc.LeftRead | gc.RegRead | gc.RightWrite},
+       ppc64.AFCMPU:  {Flags: gc.SizeD | gc.LeftRead | gc.RightRead},
+       ppc64.AFRSP:   {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
 
        // Moves
-       ppc64.AMOVB:  {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AMOVBU: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc, 0, 0, 0},
-       ppc64.AMOVBZ: {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AMOVH:  {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AMOVHU: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc, 0, 0, 0},
-       ppc64.AMOVHZ: {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AMOVW:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
+       ppc64.AMOVB:  {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AMOVBU: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc},
+       ppc64.AMOVBZ: {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AMOVH:  {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AMOVHU: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc},
+       ppc64.AMOVHZ: {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AMOVW:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
 
        // there is no AMOVWU.
-       ppc64.AMOVWZU: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc, 0, 0, 0},
-       ppc64.AMOVWZ:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AMOVD:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       ppc64.AMOVDU:  {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move | gc.PostInc, 0, 0, 0},
-       ppc64.AFMOVS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv, 0, 0, 0},
-       ppc64.AFMOVD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
+       ppc64.AMOVWZU: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv | gc.PostInc},
+       ppc64.AMOVWZ:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AMOVD:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move},
+       ppc64.AMOVDU:  {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.Move | gc.PostInc},
+       ppc64.AFMOVS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move | gc.Conv},
+       ppc64.AFMOVD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
 
        // Jumps
-       ppc64.ABR:     {gc.Jump | gc.Break, 0, 0, 0},
-       ppc64.ABL:     {gc.Call, 0, 0, 0},
-       ppc64.ABEQ:    {gc.Cjmp, 0, 0, 0},
-       ppc64.ABNE:    {gc.Cjmp, 0, 0, 0},
-       ppc64.ABGE:    {gc.Cjmp, 0, 0, 0},
-       ppc64.ABLT:    {gc.Cjmp, 0, 0, 0},
-       ppc64.ABGT:    {gc.Cjmp, 0, 0, 0},
-       ppc64.ABLE:    {gc.Cjmp, 0, 0, 0},
-       obj.ARET:      {gc.Break, 0, 0, 0},
-       obj.ADUFFZERO: {gc.Call, 0, 0, 0},
-       obj.ADUFFCOPY: {gc.Call, 0, 0, 0},
+       ppc64.ABR:     {Flags: gc.Jump | gc.Break},
+       ppc64.ABL:     {Flags: gc.Call},
+       ppc64.ABEQ:    {Flags: gc.Cjmp},
+       ppc64.ABNE:    {Flags: gc.Cjmp},
+       ppc64.ABGE:    {Flags: gc.Cjmp},
+       ppc64.ABLT:    {Flags: gc.Cjmp},
+       ppc64.ABGT:    {Flags: gc.Cjmp},
+       ppc64.ABLE:    {Flags: gc.Cjmp},
+       obj.ARET:      {Flags: gc.Break},
+       obj.ADUFFZERO: {Flags: gc.Call},
+       obj.ADUFFCOPY: {Flags: gc.Call},
 }
 
 var initproginfo_initialized int
index f96a1aa9453bbc6c9ae91d6f8376fdacf0d4ca72..ce432c17f3bdc4f12232d4e879b3318879b5e1b4 100644 (file)
@@ -31,229 +31,229 @@ var (
 //
 // The table is formatted for 8-space tabs.
 var progtable = [x86.ALAST]obj.ProgInfo{
-       obj.ATYPE:     {gc.Pseudo | gc.Skip, 0, 0, 0},
-       obj.ATEXT:     {gc.Pseudo, 0, 0, 0},
-       obj.AFUNCDATA: {gc.Pseudo, 0, 0, 0},
-       obj.APCDATA:   {gc.Pseudo, 0, 0, 0},
-       obj.AUNDEF:    {gc.Break, 0, 0, 0},
-       obj.AUSEFIELD: {gc.OK, 0, 0, 0},
-       obj.ACHECKNIL: {gc.LeftRead, 0, 0, 0},
-       obj.AVARDEF:   {gc.Pseudo | gc.RightWrite, 0, 0, 0},
-       obj.AVARKILL:  {gc.Pseudo | gc.RightWrite, 0, 0, 0},
+       obj.ATYPE:     {Flags: gc.Pseudo | gc.Skip},
+       obj.ATEXT:     {Flags: gc.Pseudo},
+       obj.AFUNCDATA: {Flags: gc.Pseudo},
+       obj.APCDATA:   {Flags: gc.Pseudo},
+       obj.AUNDEF:    {Flags: gc.Break},
+       obj.AUSEFIELD: {Flags: gc.OK},
+       obj.ACHECKNIL: {Flags: gc.LeftRead},
+       obj.AVARDEF:   {Flags: gc.Pseudo | gc.RightWrite},
+       obj.AVARKILL:  {Flags: gc.Pseudo | gc.RightWrite},
 
        // NOP is an internal no-op that also stands
        // for USED and SET annotations, not the Intel opcode.
-       obj.ANOP:       {gc.LeftRead | gc.RightWrite, 0, 0, 0},
-       x86.AADCL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AADCW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AADDB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AADDSD:     {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AADDSS:     {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AANDB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AANDL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AANDW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       obj.ACALL:      {gc.RightAddr | gc.Call | gc.KillCarry, 0, 0, 0},
-       x86.ACDQ:       {gc.OK, AX, AX | DX, 0},
-       x86.ACWD:       {gc.OK, AX, AX | DX, 0},
-       x86.ACLD:       {gc.OK, 0, 0, 0},
-       x86.ASTD:       {gc.OK, 0, 0, 0},
-       x86.ACMPB:      {gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACMPL:      {gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACMPW:      {gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACOMISD:    {gc.SizeD | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACOMISS:    {gc.SizeF | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ACVTSD2SL:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSD2SS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSL2SD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSL2SS:  {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSS2SD:  {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTSS2SL:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSD2SL: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ACVTTSS2SL: {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.ADECB:      {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.ADECL:      {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.ADECW:      {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.ADIVB:      {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.ADIVL:      {gc.SizeL | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.ADIVW:      {gc.SizeW | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.ADIVSD:     {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ADIVSS:     {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AFLDCW:     {gc.SizeW | gc.LeftAddr, 0, 0, 0},
-       x86.AFSTCW:     {gc.SizeW | gc.RightAddr, 0, 0, 0},
-       x86.AFSTSW:     {gc.SizeW | gc.RightAddr | gc.RightWrite, 0, 0, 0},
-       x86.AFADDD:     {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFADDDP:    {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFADDF:     {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFCOMD:     {gc.SizeD | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFCOMDP:    {gc.SizeD | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFCOMDPP:   {gc.SizeD | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFCOMF:     {gc.SizeF | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFCOMFP:    {gc.SizeF | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFUCOMIP:   {gc.SizeF | gc.LeftAddr | gc.RightRead, 0, 0, 0},
-       x86.AFCHS:      {gc.SizeD | RightRdwr, 0, 0, 0}, // also SizeF
+       obj.ANOP:       {Flags: gc.LeftRead | gc.RightWrite},
+       x86.AADCL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.AADCW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.AADDB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AADDSD:     {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.AADDSS:     {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.AANDB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AANDL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AANDW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       obj.ACALL:      {Flags: gc.RightAddr | gc.Call | gc.KillCarry},
+       x86.ACDQ:       {Flags: gc.OK, Reguse: AX, Regset: AX | DX},
+       x86.ACWD:       {Flags: gc.OK, Reguse: AX, Regset: AX | DX},
+       x86.ACLD:       {Flags: gc.OK},
+       x86.ASTD:       {Flags: gc.OK},
+       x86.ACMPB:      {Flags: gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACMPL:      {Flags: gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACMPW:      {Flags: gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACOMISD:    {Flags: gc.SizeD | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACOMISS:    {Flags: gc.SizeF | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ACVTSD2SL:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSD2SS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSL2SD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSL2SS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSS2SD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTSS2SL:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSD2SL: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ACVTTSS2SL: {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.ADECB:      {Flags: gc.SizeB | RightRdwr},
+       x86.ADECL:      {Flags: gc.SizeL | RightRdwr},
+       x86.ADECW:      {Flags: gc.SizeW | RightRdwr},
+       x86.ADIVB:      {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.ADIVL:      {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.ADIVW:      {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.ADIVSD:     {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.ADIVSS:     {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.AFLDCW:     {Flags: gc.SizeW | gc.LeftAddr},
+       x86.AFSTCW:     {Flags: gc.SizeW | gc.RightAddr},
+       x86.AFSTSW:     {Flags: gc.SizeW | gc.RightAddr | gc.RightWrite},
+       x86.AFADDD:     {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFADDDP:    {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFADDF:     {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AFCOMD:     {Flags: gc.SizeD | gc.LeftAddr | gc.RightRead},
+       x86.AFCOMDP:    {Flags: gc.SizeD | gc.LeftAddr | gc.RightRead},
+       x86.AFCOMDPP:   {Flags: gc.SizeD | gc.LeftAddr | gc.RightRead},
+       x86.AFCOMF:     {Flags: gc.SizeF | gc.LeftAddr | gc.RightRead},
+       x86.AFCOMFP:    {Flags: gc.SizeF | gc.LeftAddr | gc.RightRead},
+       x86.AFUCOMIP:   {Flags: gc.SizeF | gc.LeftAddr | gc.RightRead},
+       x86.AFCHS:      {Flags: gc.SizeD | RightRdwr}, // also SizeF
 
-       x86.AFDIVDP:  {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFDIVF:   {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFDIVD:   {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFDIVRDP: {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFDIVRF:  {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFDIVRD:  {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFXCHD:   {gc.SizeD | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AFSUBD:   {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFSUBDP:  {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFSUBF:   {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFSUBRD:  {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFSUBRDP: {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFSUBRF:  {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFMOVD:   {gc.SizeD | gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AFMOVF:   {gc.SizeF | gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AFMOVL:   {gc.SizeL | gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AFMOVW:   {gc.SizeW | gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AFMOVV:   {gc.SizeQ | gc.LeftAddr | gc.RightWrite, 0, 0, 0},
+       x86.AFDIVDP:  {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFDIVF:   {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AFDIVD:   {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFDIVRDP: {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFDIVRF:  {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AFDIVRD:  {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFXCHD:   {Flags: gc.SizeD | LeftRdwr | RightRdwr},
+       x86.AFSUBD:   {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFSUBDP:  {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFSUBF:   {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AFSUBRD:  {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFSUBRDP: {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFSUBRF:  {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AFMOVD:   {Flags: gc.SizeD | gc.LeftAddr | gc.RightWrite},
+       x86.AFMOVF:   {Flags: gc.SizeF | gc.LeftAddr | gc.RightWrite},
+       x86.AFMOVL:   {Flags: gc.SizeL | gc.LeftAddr | gc.RightWrite},
+       x86.AFMOVW:   {Flags: gc.SizeW | gc.LeftAddr | gc.RightWrite},
+       x86.AFMOVV:   {Flags: gc.SizeQ | gc.LeftAddr | gc.RightWrite},
 
        // These instructions are marked as RightAddr
        // so that the register optimizer does not try to replace the
        // memory references with integer register references.
        // But they do not use the previous value at the address, so
        // we also mark them RightWrite.
-       x86.AFMOVDP:   {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.RightAddr, 0, 0, 0},
-       x86.AFMOVFP:   {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.RightAddr, 0, 0, 0},
-       x86.AFMOVLP:   {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.RightAddr, 0, 0, 0},
-       x86.AFMOVWP:   {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.RightAddr, 0, 0, 0},
-       x86.AFMOVVP:   {gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.RightAddr, 0, 0, 0},
-       x86.AFMULD:    {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFMULDP:   {gc.SizeD | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AFMULF:    {gc.SizeF | gc.LeftAddr | RightRdwr, 0, 0, 0},
-       x86.AIDIVB:    {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AIDIVL:    {gc.SizeL | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.AIDIVW:    {gc.SizeW | gc.LeftRead | gc.SetCarry, AX | DX, AX | DX, 0},
-       x86.AIMULB:    {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AIMULL:    {gc.SizeL | gc.LeftRead | gc.ImulAXDX | gc.SetCarry, 0, 0, 0},
-       x86.AIMULW:    {gc.SizeW | gc.LeftRead | gc.ImulAXDX | gc.SetCarry, 0, 0, 0},
-       x86.AINCB:     {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.AINCL:     {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.AINCW:     {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.AJCC:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJCS:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJEQ:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJGE:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJGT:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJHI:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLE:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLS:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJLT:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJMI:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJNE:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJOC:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJOS:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPC:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPL:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       x86.AJPS:      {gc.Cjmp | gc.UseCarry, 0, 0, 0},
-       obj.AJMP:      {gc.Jump | gc.Break | gc.KillCarry, 0, 0, 0},
-       x86.ALEAL:     {gc.LeftAddr | gc.RightWrite, 0, 0, 0},
-       x86.AMOVBLSX:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBLZX:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBWSX:  {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVBWZX:  {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWLSX:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVWLZX:  {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv, 0, 0, 0},
-       x86.AMOVB:     {gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVL:     {gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVW:     {gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVSB:    {gc.OK, DI | SI, DI | SI, 0},
-       x86.AMOVSL:    {gc.OK, DI | SI, DI | SI, 0},
-       x86.AMOVSW:    {gc.OK, DI | SI, DI | SI, 0},
-       obj.ADUFFCOPY: {gc.OK, DI | SI, DI | SI | CX, 0},
-       x86.AMOVSD:    {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMOVSS:    {gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
+       x86.AFMOVDP:   {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.RightAddr},
+       x86.AFMOVFP:   {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.RightAddr},
+       x86.AFMOVLP:   {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.RightAddr},
+       x86.AFMOVWP:   {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.RightAddr},
+       x86.AFMOVVP:   {Flags: gc.SizeQ | gc.LeftRead | gc.RightWrite | gc.RightAddr},
+       x86.AFMULD:    {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFMULDP:   {Flags: gc.SizeD | gc.LeftAddr | RightRdwr},
+       x86.AFMULF:    {Flags: gc.SizeF | gc.LeftAddr | RightRdwr},
+       x86.AIDIVB:    {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AIDIVL:    {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.AIDIVW:    {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX | DX, Regset: AX | DX},
+       x86.AIMULB:    {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AIMULL:    {Flags: gc.SizeL | gc.LeftRead | gc.ImulAXDX | gc.SetCarry},
+       x86.AIMULW:    {Flags: gc.SizeW | gc.LeftRead | gc.ImulAXDX | gc.SetCarry},
+       x86.AINCB:     {Flags: gc.SizeB | RightRdwr},
+       x86.AINCL:     {Flags: gc.SizeL | RightRdwr},
+       x86.AINCW:     {Flags: gc.SizeW | RightRdwr},
+       x86.AJCC:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJCS:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJEQ:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJGE:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJGT:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJHI:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLE:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLS:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJLT:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJMI:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJNE:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJOC:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJOS:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPC:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPL:      {Flags: gc.Cjmp | gc.UseCarry},
+       x86.AJPS:      {Flags: gc.Cjmp | gc.UseCarry},
+       obj.AJMP:      {Flags: gc.Jump | gc.Break | gc.KillCarry},
+       x86.ALEAL:     {Flags: gc.LeftAddr | gc.RightWrite},
+       x86.AMOVBLSX:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBLZX:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBWSX:  {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVBWZX:  {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWLSX:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVWLZX:  {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Conv},
+       x86.AMOVB:     {Flags: gc.SizeB | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVL:     {Flags: gc.SizeL | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVW:     {Flags: gc.SizeW | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVSB:    {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       x86.AMOVSL:    {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       x86.AMOVSW:    {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI},
+       obj.ADUFFCOPY: {Flags: gc.OK, Reguse: DI | SI, Regset: DI | SI | CX},
+       x86.AMOVSD:    {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMOVSS:    {Flags: gc.SizeF | gc.LeftRead | gc.RightWrite | gc.Move},
 
        // We use MOVAPD as a faster synonym for MOVSD.
-       x86.AMOVAPD:   {gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move, 0, 0, 0},
-       x86.AMULB:     {gc.SizeB | gc.LeftRead | gc.SetCarry, AX, AX, 0},
-       x86.AMULL:     {gc.SizeL | gc.LeftRead | gc.SetCarry, AX, AX | DX, 0},
-       x86.AMULW:     {gc.SizeW | gc.LeftRead | gc.SetCarry, AX, AX | DX, 0},
-       x86.AMULSD:    {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.AMULSS:    {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ANEGB:     {gc.SizeB | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANEGL:     {gc.SizeL | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANEGW:     {gc.SizeW | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ANOTB:     {gc.SizeB | RightRdwr, 0, 0, 0},
-       x86.ANOTL:     {gc.SizeL | RightRdwr, 0, 0, 0},
-       x86.ANOTW:     {gc.SizeW | RightRdwr, 0, 0, 0},
-       x86.AORB:      {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AORL:      {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AORW:      {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.APOPL:     {gc.SizeL | gc.RightWrite, 0, 0, 0},
-       x86.APUSHL:    {gc.SizeL | gc.LeftRead, 0, 0, 0},
-       x86.ARCLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ARCRW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.AREP:      {gc.OK, CX, CX, 0},
-       x86.AREPN:     {gc.OK, CX, CX, 0},
-       obj.ARET:      {gc.Break | gc.KillCarry, 0, 0, 0},
-       x86.AROLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.AROLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.AROLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ARORW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASAHF:     {gc.OK, AX, AX, 0},
-       x86.ASALB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASALW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASARW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASBBB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASBBL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASBBW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry, 0, 0, 0},
-       x86.ASETCC:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETCS:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETEQ:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETGE:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETGT:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETHI:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETLE:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETLS:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETLT:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETMI:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETNE:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETOC:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETOS:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETPC:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETPL:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASETPS:    {gc.SizeB | RightRdwr | gc.UseCarry, 0, 0, 0},
-       x86.ASHLB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHLL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHLW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASHRW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry, 0, 0, 0},
-       x86.ASTOSB:    {gc.OK, AX | DI, DI, 0},
-       x86.ASTOSL:    {gc.OK, AX | DI, DI, 0},
-       x86.ASTOSW:    {gc.OK, AX | DI, DI, 0},
-       obj.ADUFFZERO: {gc.OK, AX | DI, DI, 0},
-       x86.ASUBB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.ASUBSD:    {gc.SizeD | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ASUBSS:    {gc.SizeF | gc.LeftRead | RightRdwr, 0, 0, 0},
-       x86.ATESTB:    {gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ATESTL:    {gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.ATESTW:    {gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry, 0, 0, 0},
-       x86.AUCOMISD:  {gc.SizeD | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       x86.AUCOMISS:  {gc.SizeF | gc.LeftRead | gc.RightRead, 0, 0, 0},
-       x86.AXCHGB:    {gc.SizeB | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXCHGL:    {gc.SizeL | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXCHGW:    {gc.SizeW | LeftRdwr | RightRdwr, 0, 0, 0},
-       x86.AXORB:     {gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AXORL:     {gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
-       x86.AXORW:     {gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
+       x86.AMOVAPD:   {Flags: gc.SizeD | gc.LeftRead | gc.RightWrite | gc.Move},
+       x86.AMULB:     {Flags: gc.SizeB | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX},
+       x86.AMULL:     {Flags: gc.SizeL | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX | DX},
+       x86.AMULW:     {Flags: gc.SizeW | gc.LeftRead | gc.SetCarry, Reguse: AX, Regset: AX | DX},
+       x86.AMULSD:    {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.AMULSS:    {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.ANEGB:     {Flags: gc.SizeB | RightRdwr | gc.SetCarry},
+       x86.ANEGL:     {Flags: gc.SizeL | RightRdwr | gc.SetCarry},
+       x86.ANEGW:     {Flags: gc.SizeW | RightRdwr | gc.SetCarry},
+       x86.ANOTB:     {Flags: gc.SizeB | RightRdwr},
+       x86.ANOTL:     {Flags: gc.SizeL | RightRdwr},
+       x86.ANOTW:     {Flags: gc.SizeW | RightRdwr},
+       x86.AORB:      {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AORL:      {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AORW:      {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.APOPL:     {Flags: gc.SizeL | gc.RightWrite},
+       x86.APUSHL:    {Flags: gc.SizeL | gc.LeftRead},
+       x86.ARCLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.ARCRW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry | gc.UseCarry},
+       x86.AREP:      {Flags: gc.OK, Reguse: CX, Regset: CX},
+       x86.AREPN:     {Flags: gc.OK, Reguse: CX, Regset: CX},
+       obj.ARET:      {Flags: gc.Break | gc.KillCarry},
+       x86.AROLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.AROLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.AROLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ARORW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASAHF:     {Flags: gc.OK, Reguse: AX, Regset: AX},
+       x86.ASALB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASALW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASARW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASBBB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASBBL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASBBW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry | gc.UseCarry},
+       x86.ASETCC:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETCS:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETEQ:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETGE:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETGT:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETHI:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETLE:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETLS:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETLT:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETMI:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETNE:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETOC:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETOS:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETPC:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETPL:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASETPS:    {Flags: gc.SizeB | RightRdwr | gc.UseCarry},
+       x86.ASHLB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHLL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHLW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASHRW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.ShiftCX | gc.SetCarry},
+       x86.ASTOSB:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASTOSL:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASTOSW:    {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       obj.ADUFFZERO: {Flags: gc.OK, Reguse: AX | DI, Regset: DI},
+       x86.ASUBB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.ASUBSD:    {Flags: gc.SizeD | gc.LeftRead | RightRdwr},
+       x86.ASUBSS:    {Flags: gc.SizeF | gc.LeftRead | RightRdwr},
+       x86.ATESTB:    {Flags: gc.SizeB | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ATESTL:    {Flags: gc.SizeL | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.ATESTW:    {Flags: gc.SizeW | gc.LeftRead | gc.RightRead | gc.SetCarry},
+       x86.AUCOMISD:  {Flags: gc.SizeD | gc.LeftRead | gc.RightRead},
+       x86.AUCOMISS:  {Flags: gc.SizeF | gc.LeftRead | gc.RightRead},
+       x86.AXCHGB:    {Flags: gc.SizeB | LeftRdwr | RightRdwr},
+       x86.AXCHGL:    {Flags: gc.SizeL | LeftRdwr | RightRdwr},
+       x86.AXCHGW:    {Flags: gc.SizeW | LeftRdwr | RightRdwr},
+       x86.AXORB:     {Flags: gc.SizeB | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AXORL:     {Flags: gc.SizeL | gc.LeftRead | RightRdwr | gc.SetCarry},
+       x86.AXORW:     {Flags: gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry},
 }
 
 func proginfo(p *obj.Prog) {
index 688c2785d13e0422802fc23f44c1da74ce708a16..3798e23333938271479306c41693f699ee9c1342 100644 (file)
@@ -247,10 +247,11 @@ func (p *Prog) From3Offset() int64 {
 // by clients such as the compiler. The exact meaning of this
 // data is up to the client and is not interpreted by the cmd/internal/obj/... packages.
 type ProgInfo struct {
-       Flags    uint32 // flag bits
-       Reguse   uint64 // registers implicitly used by this instruction
-       Regset   uint64 // registers implicitly set by this instruction
-       Regindex uint64 // registers used by addressing mode
+       Flags    uint32   // flag bits
+       Reguse   uint64   // registers implicitly used by this instruction
+       Regset   uint64   // registers implicitly set by this instruction
+       Regindex uint64   // registers used by addressing mode
+       _        struct{} // to prevent unkeyed literals
 }
 
 // Prog.as opcodes.