aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/6g/prog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6g/prog.c')
-rw-r--r--src/cmd/6g/prog.c318
1 files changed, 0 insertions, 318 deletions
diff --git a/src/cmd/6g/prog.c b/src/cmd/6g/prog.c
deleted file mode 100644
index 79b7911e5b..0000000000
--- a/src/cmd/6g/prog.c
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <u.h>
-#include <libc.h>
-#include "gg.h"
-#include "../gc/popt.h"
-
-// Matches real RtoB but can be used in global initializer.
-#define RtoB(r) (1<<((r)-REG_AX))
-
-enum {
- AX = RtoB(REG_AX),
- BX = RtoB(REG_BX),
- CX = RtoB(REG_CX),
- DX = RtoB(REG_DX),
- DI = RtoB(REG_DI),
- SI = RtoB(REG_SI),
-
- LeftRdwr = LeftRead | LeftWrite,
- RightRdwr = RightRead | RightWrite,
-};
-
-#undef RtoB
-
-// This table gives the basic information about instruction
-// generated by the compiler and processed in the optimizer.
-// See opt.h for bit definitions.
-//
-// Instructions not generated need not be listed.
-// As an exception to that rule, we typically write down all the
-// size variants of an operation even if we just use a subset.
-//
-// The table is formatted for 8-space tabs.
-static ProgInfo progtable[ALAST] = {
- [ATYPE]= {Pseudo | Skip},
- [ATEXT]= {Pseudo},
- [AFUNCDATA]= {Pseudo},
- [APCDATA]= {Pseudo},
- [AUNDEF]= {Break},
- [AUSEFIELD]= {OK},
- [ACHECKNIL]= {LeftRead},
- [AVARDEF]= {Pseudo | RightWrite},
- [AVARKILL]= {Pseudo | RightWrite},
-
- // NOP is an internal no-op that also stands
- // for USED and SET annotations, not the Intel opcode.
- [ANOP]= {LeftRead | RightWrite},
-
- [AADCL]= {SizeL | LeftRead | RightRdwr | SetCarry | UseCarry},
- [AADCQ]= {SizeQ | LeftRead | RightRdwr | SetCarry | UseCarry},
- [AADCW]= {SizeW | LeftRead | RightRdwr | SetCarry | UseCarry},
-
- [AADDB]= {SizeB | LeftRead | RightRdwr | SetCarry},
- [AADDL]= {SizeL | LeftRead | RightRdwr | SetCarry},
- [AADDW]= {SizeW | LeftRead | RightRdwr | SetCarry},
- [AADDQ]= {SizeQ | LeftRead | RightRdwr | SetCarry},
-
- [AADDSD]= {SizeD | LeftRead | RightRdwr},
- [AADDSS]= {SizeF | LeftRead | RightRdwr},
-
- [AANDB]= {SizeB | LeftRead | RightRdwr | SetCarry},
- [AANDL]= {SizeL | LeftRead | RightRdwr | SetCarry},
- [AANDQ]= {SizeQ | LeftRead | RightRdwr | SetCarry},
- [AANDW]= {SizeW | LeftRead | RightRdwr | SetCarry},
-
- [ACALL]= {RightAddr | Call | KillCarry},
-
- [ACDQ]= {OK, AX, AX | DX},
- [ACQO]= {OK, AX, AX | DX},
- [ACWD]= {OK, AX, AX | DX},
-
- [ACLD]= {OK},
- [ASTD]= {OK},
-
- [ACMPB]= {SizeB | LeftRead | RightRead | SetCarry},
- [ACMPL]= {SizeL | LeftRead | RightRead | SetCarry},
- [ACMPQ]= {SizeQ | LeftRead | RightRead | SetCarry},
- [ACMPW]= {SizeW | LeftRead | RightRead | SetCarry},
-
- [ACOMISD]= {SizeD | LeftRead | RightRead | SetCarry},
- [ACOMISS]= {SizeF | LeftRead | RightRead | SetCarry},
-
- [ACVTSD2SL]= {SizeL | LeftRead | RightWrite | Conv},
- [ACVTSD2SQ]= {SizeQ | LeftRead | RightWrite | Conv},
- [ACVTSD2SS]= {SizeF | LeftRead | RightWrite | Conv},
- [ACVTSL2SD]= {SizeD | LeftRead | RightWrite | Conv},
- [ACVTSL2SS]= {SizeF | LeftRead | RightWrite | Conv},
- [ACVTSQ2SD]= {SizeD | LeftRead | RightWrite | Conv},
- [ACVTSQ2SS]= {SizeF | LeftRead | RightWrite | Conv},
- [ACVTSS2SD]= {SizeD | LeftRead | RightWrite | Conv},
- [ACVTSS2SL]= {SizeL | LeftRead | RightWrite | Conv},
- [ACVTSS2SQ]= {SizeQ | LeftRead | RightWrite | Conv},
- [ACVTTSD2SL]= {SizeL | LeftRead | RightWrite | Conv},
- [ACVTTSD2SQ]= {SizeQ | LeftRead | RightWrite | Conv},
- [ACVTTSS2SL]= {SizeL | LeftRead | RightWrite | Conv},
- [ACVTTSS2SQ]= {SizeQ | LeftRead | RightWrite | Conv},
-
- [ADECB]= {SizeB | RightRdwr},
- [ADECL]= {SizeL | RightRdwr},
- [ADECQ]= {SizeQ | RightRdwr},
- [ADECW]= {SizeW | RightRdwr},
-
- [ADIVB]= {SizeB | LeftRead | SetCarry, AX, AX},
- [ADIVL]= {SizeL | LeftRead | SetCarry, AX|DX, AX|DX},
- [ADIVQ]= {SizeQ | LeftRead | SetCarry, AX|DX, AX|DX},
- [ADIVW]= {SizeW | LeftRead | SetCarry, AX|DX, AX|DX},
-
- [ADIVSD]= {SizeD | LeftRead | RightRdwr},
- [ADIVSS]= {SizeF | LeftRead | RightRdwr},
-
- [AIDIVB]= {SizeB | LeftRead | SetCarry, AX, AX},
- [AIDIVL]= {SizeL | LeftRead | SetCarry, AX|DX, AX|DX},
- [AIDIVQ]= {SizeQ | LeftRead | SetCarry, AX|DX, AX|DX},
- [AIDIVW]= {SizeW | LeftRead | SetCarry, AX|DX, AX|DX},
-
- [AIMULB]= {SizeB | LeftRead | SetCarry, AX, AX},
- [AIMULL]= {SizeL | LeftRead | ImulAXDX | SetCarry},
- [AIMULQ]= {SizeQ | LeftRead | ImulAXDX | SetCarry},
- [AIMULW]= {SizeW | LeftRead | ImulAXDX | SetCarry},
-
- [AINCB]= {SizeB | RightRdwr},
- [AINCL]= {SizeL | RightRdwr},
- [AINCQ]= {SizeQ | RightRdwr},
- [AINCW]= {SizeW | RightRdwr},
-
- [AJCC]= {Cjmp | UseCarry},
- [AJCS]= {Cjmp | UseCarry},
- [AJEQ]= {Cjmp | UseCarry},
- [AJGE]= {Cjmp | UseCarry},
- [AJGT]= {Cjmp | UseCarry},
- [AJHI]= {Cjmp | UseCarry},
- [AJLE]= {Cjmp | UseCarry},
- [AJLS]= {Cjmp | UseCarry},
- [AJLT]= {Cjmp | UseCarry},
- [AJMI]= {Cjmp | UseCarry},
- [AJNE]= {Cjmp | UseCarry},
- [AJOC]= {Cjmp | UseCarry},
- [AJOS]= {Cjmp | UseCarry},
- [AJPC]= {Cjmp | UseCarry},
- [AJPL]= {Cjmp | UseCarry},
- [AJPS]= {Cjmp | UseCarry},
-
- [AJMP]= {Jump | Break | KillCarry},
-
- [ALEAL]= {LeftAddr | RightWrite},
- [ALEAQ]= {LeftAddr | RightWrite},
-
- [AMOVBLSX]= {SizeL | LeftRead | RightWrite | Conv},
- [AMOVBLZX]= {SizeL | LeftRead | RightWrite | Conv},
- [AMOVBQSX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVBQZX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVBWSX]= {SizeW | LeftRead | RightWrite | Conv},
- [AMOVBWZX]= {SizeW | LeftRead | RightWrite | Conv},
- [AMOVLQSX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVLQZX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVWLSX]= {SizeL | LeftRead | RightWrite | Conv},
- [AMOVWLZX]= {SizeL | LeftRead | RightWrite | Conv},
- [AMOVWQSX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVWQZX]= {SizeQ | LeftRead | RightWrite | Conv},
- [AMOVQL]= {SizeL | LeftRead | RightWrite | Conv},
-
- [AMOVB]= {SizeB | LeftRead | RightWrite | Move},
- [AMOVL]= {SizeL | LeftRead | RightWrite | Move},
- [AMOVQ]= {SizeQ | LeftRead | RightWrite | Move},
- [AMOVW]= {SizeW | LeftRead | RightWrite | Move},
-
- [AMOVSB]= {OK, DI|SI, DI|SI},
- [AMOVSL]= {OK, DI|SI, DI|SI},
- [AMOVSQ]= {OK, DI|SI, DI|SI},
- [AMOVSW]= {OK, DI|SI, DI|SI},
- [ADUFFCOPY]= {OK, DI|SI, DI|SI|CX},
-
- [AMOVSD]= {SizeD | LeftRead | RightWrite | Move},
- [AMOVSS]= {SizeF | LeftRead | RightWrite | Move},
-
- // We use MOVAPD as a faster synonym for MOVSD.
- [AMOVAPD]= {SizeD | LeftRead | RightWrite | Move},
-
- [AMULB]= {SizeB | LeftRead | SetCarry, AX, AX},
- [AMULL]= {SizeL | LeftRead | SetCarry, AX, AX|DX},
- [AMULQ]= {SizeQ | LeftRead | SetCarry, AX, AX|DX},
- [AMULW]= {SizeW | LeftRead | SetCarry, AX, AX|DX},
-
- [AMULSD]= {SizeD | LeftRead | RightRdwr},
- [AMULSS]= {SizeF | LeftRead | RightRdwr},
-
- [ANEGB]= {SizeB | RightRdwr | SetCarry},
- [ANEGL]= {SizeL | RightRdwr | SetCarry},
- [ANEGQ]= {SizeQ | RightRdwr | SetCarry},
- [ANEGW]= {SizeW | RightRdwr | SetCarry},
-
- [ANOTB]= {SizeB | RightRdwr},
- [ANOTL]= {SizeL | RightRdwr},
- [ANOTQ]= {SizeQ | RightRdwr},
- [ANOTW]= {SizeW | RightRdwr},
-
- [AORB]= {SizeB | LeftRead | RightRdwr | SetCarry},
- [AORL]= {SizeL | LeftRead | RightRdwr | SetCarry},
- [AORQ]= {SizeQ | LeftRead | RightRdwr | SetCarry},
- [AORW]= {SizeW | LeftRead | RightRdwr | SetCarry},
-
- [APOPQ]= {SizeQ | RightWrite},
- [APUSHQ]= {SizeQ | LeftRead},
-
- [ARCLB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCLL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCLQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCLW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
-
- [ARCRB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCRL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCRQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
- [ARCRW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry | UseCarry},
-
- [AREP]= {OK, CX, CX},
- [AREPN]= {OK, CX, CX},
-
- [ARET]= {Break | KillCarry},
-
- [AROLB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [AROLL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [AROLQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [AROLW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ARORB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ARORL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ARORQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ARORW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ASALB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASALL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASALQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASALW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ASARB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASARL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASARQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASARW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ASBBB]= {SizeB | LeftRead | RightRdwr | SetCarry | UseCarry},
- [ASBBL]= {SizeL | LeftRead | RightRdwr | SetCarry | UseCarry},
- [ASBBQ]= {SizeQ | LeftRead | RightRdwr | SetCarry | UseCarry},
- [ASBBW]= {SizeW | LeftRead | RightRdwr | SetCarry | UseCarry},
-
- [ASHLB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHLL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHLQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHLW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ASHRB]= {SizeB | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHRL]= {SizeL | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHRQ]= {SizeQ | LeftRead | RightRdwr | ShiftCX | SetCarry},
- [ASHRW]= {SizeW | LeftRead | RightRdwr | ShiftCX | SetCarry},
-
- [ASTOSB]= {OK, AX|DI, DI},
- [ASTOSL]= {OK, AX|DI, DI},
- [ASTOSQ]= {OK, AX|DI, DI},
- [ASTOSW]= {OK, AX|DI, DI},
- [ADUFFZERO]= {OK, AX|DI, DI},
-
- [ASUBB]= {SizeB | LeftRead | RightRdwr | SetCarry},
- [ASUBL]= {SizeL | LeftRead | RightRdwr | SetCarry},
- [ASUBQ]= {SizeQ | LeftRead | RightRdwr | SetCarry},
- [ASUBW]= {SizeW | LeftRead | RightRdwr | SetCarry},
-
- [ASUBSD]= {SizeD | LeftRead | RightRdwr},
- [ASUBSS]= {SizeF | LeftRead | RightRdwr},
-
- [ATESTB]= {SizeB | LeftRead | RightRead | SetCarry},
- [ATESTL]= {SizeL | LeftRead | RightRead | SetCarry},
- [ATESTQ]= {SizeQ | LeftRead | RightRead | SetCarry},
- [ATESTW]= {SizeW | LeftRead | RightRead | SetCarry},
-
- [AUCOMISD]= {SizeD | LeftRead | RightRead},
- [AUCOMISS]= {SizeF | LeftRead | RightRead},
-
- [AXCHGB]= {SizeB | LeftRdwr | RightRdwr},
- [AXCHGL]= {SizeL | LeftRdwr | RightRdwr},
- [AXCHGQ]= {SizeQ | LeftRdwr | RightRdwr},
- [AXCHGW]= {SizeW | LeftRdwr | RightRdwr},
-
- [AXORB]= {SizeB | LeftRead | RightRdwr | SetCarry},
- [AXORL]= {SizeL | LeftRead | RightRdwr | SetCarry},
- [AXORQ]= {SizeQ | LeftRead | RightRdwr | SetCarry},
- [AXORW]= {SizeW | LeftRead | RightRdwr | SetCarry},
-};
-
-void
-proginfo(ProgInfo *info, Prog *p)
-{
- *info = progtable[p->as];
- if(info->flags == 0)
- fatal("unknown instruction %P", p);
-
- if((info->flags & ShiftCX) && p->from.type != TYPE_CONST)
- info->reguse |= CX;
-
- if(info->flags & ImulAXDX) {
- if(p->to.type == TYPE_NONE) {
- info->reguse |= AX;
- info->regset |= AX | DX;
- } else {
- info->flags |= RightRdwr;
- }
- }
-
- // Addressing makes some registers used.
- if(p->from.type == TYPE_MEM && p->from.name == NAME_NONE)
- info->regindex |= RtoB(p->from.reg);
- if(p->from.index != REG_NONE)
- info->regindex |= RtoB(p->from.index);
- if(p->to.type == TYPE_MEM && p->to.name == NAME_NONE)
- info->regindex |= RtoB(p->to.reg);
- if(p->to.index != REG_NONE)
- info->regindex |= RtoB(p->to.index);
-}