github.com/rsc/go@v0.0.0-20150416155037-e040fd465409/src/cmd/old8a/lex.go (about)

     1  // Inferno utils/8a/lex.c
     2  // http://code.google.com/p/inferno-os/source/browse/utils/8a/lex.c
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.	All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  //go:generate go tool yacc a.y
    32  
    33  package main
    34  
    35  import (
    36  	"cmd/internal/asm"
    37  	"cmd/internal/obj"
    38  	"cmd/internal/obj/x86"
    39  )
    40  
    41  var (
    42  	yyerror  = asm.Yyerror
    43  	nullgen  obj.Addr
    44  	stmtline int32
    45  )
    46  
    47  func main() {
    48  	cinit()
    49  
    50  	asm.LSCONST = LSCONST
    51  	asm.LCONST = LCONST
    52  	asm.LFCONST = LFCONST
    53  	asm.LNAME = LNAME
    54  	asm.LVAR = LVAR
    55  	asm.LLAB = LLAB
    56  
    57  	asm.Lexinit = lexinit
    58  	asm.Cclean = cclean
    59  	asm.Yyparse = yyparse
    60  
    61  	asm.Thechar = '8'
    62  	asm.Thestring = "386"
    63  	asm.Thelinkarch = &x86.Link386
    64  
    65  	asm.Main()
    66  }
    67  
    68  type yy struct{}
    69  
    70  func (yy) Lex(v *yySymType) int {
    71  	var av asm.Yylval
    72  	tok := asm.Yylex(&av)
    73  	v.sym = av.Sym
    74  	v.lval = av.Lval
    75  	v.sval = av.Sval
    76  	v.dval = av.Dval
    77  	return tok
    78  }
    79  
    80  func (yy) Error(msg string) {
    81  	asm.Yyerror("%s", msg)
    82  }
    83  
    84  func yyparse() {
    85  	yyParse(yy{})
    86  }
    87  
    88  var lexinit = []asm.Lextab{
    89  	{"SP", LSP, obj.NAME_AUTO},
    90  	{"SB", LSB, obj.NAME_EXTERN},
    91  	{"FP", LFP, obj.NAME_PARAM},
    92  	{"PC", LPC, obj.TYPE_BRANCH},
    93  	{"AL", LBREG, x86.REG_AL},
    94  	{"CL", LBREG, x86.REG_CL},
    95  	{"DL", LBREG, x86.REG_DL},
    96  	{"BL", LBREG, x86.REG_BL},
    97  	{"AH", LBREG, x86.REG_AH},
    98  	{"CH", LBREG, x86.REG_CH},
    99  	{"DH", LBREG, x86.REG_DH},
   100  	{"BH", LBREG, x86.REG_BH},
   101  	{"AX", LLREG, x86.REG_AX},
   102  	{"CX", LLREG, x86.REG_CX},
   103  	{"DX", LLREG, x86.REG_DX},
   104  	{"BX", LLREG, x86.REG_BX},
   105  	/*	"SP",		LLREG,	REG_SP,	*/
   106  	{"BP", LLREG, x86.REG_BP},
   107  	{"SI", LLREG, x86.REG_SI},
   108  	{"DI", LLREG, x86.REG_DI},
   109  	{"F0", LFREG, x86.REG_F0 + 0},
   110  	{"F1", LFREG, x86.REG_F0 + 1},
   111  	{"F2", LFREG, x86.REG_F0 + 2},
   112  	{"F3", LFREG, x86.REG_F0 + 3},
   113  	{"F4", LFREG, x86.REG_F0 + 4},
   114  	{"F5", LFREG, x86.REG_F0 + 5},
   115  	{"F6", LFREG, x86.REG_F0 + 6},
   116  	{"F7", LFREG, x86.REG_F0 + 7},
   117  	{"X0", LXREG, x86.REG_X0 + 0},
   118  	{"X1", LXREG, x86.REG_X0 + 1},
   119  	{"X2", LXREG, x86.REG_X0 + 2},
   120  	{"X3", LXREG, x86.REG_X0 + 3},
   121  	{"X4", LXREG, x86.REG_X0 + 4},
   122  	{"X5", LXREG, x86.REG_X0 + 5},
   123  	{"X6", LXREG, x86.REG_X0 + 6},
   124  	{"X7", LXREG, x86.REG_X0 + 7},
   125  	{"CS", LSREG, x86.REG_CS},
   126  	{"SS", LSREG, x86.REG_SS},
   127  	{"DS", LSREG, x86.REG_DS},
   128  	{"ES", LSREG, x86.REG_ES},
   129  	{"FS", LSREG, x86.REG_FS},
   130  	{"GS", LSREG, x86.REG_GS},
   131  	{"TLS", LSREG, x86.REG_TLS},
   132  	{"GDTR", LBREG, x86.REG_GDTR},
   133  	{"IDTR", LBREG, x86.REG_IDTR},
   134  	{"LDTR", LBREG, x86.REG_LDTR},
   135  	{"MSW", LBREG, x86.REG_MSW},
   136  	{"TASK", LBREG, x86.REG_TASK},
   137  	{"CR0", LBREG, x86.REG_CR + 0},
   138  	{"CR1", LBREG, x86.REG_CR + 1},
   139  	{"CR2", LBREG, x86.REG_CR + 2},
   140  	{"CR3", LBREG, x86.REG_CR + 3},
   141  	{"CR4", LBREG, x86.REG_CR + 4},
   142  	{"CR5", LBREG, x86.REG_CR + 5},
   143  	{"CR6", LBREG, x86.REG_CR + 6},
   144  	{"CR7", LBREG, x86.REG_CR + 7},
   145  	{"DR0", LBREG, x86.REG_DR + 0},
   146  	{"DR1", LBREG, x86.REG_DR + 1},
   147  	{"DR2", LBREG, x86.REG_DR + 2},
   148  	{"DR3", LBREG, x86.REG_DR + 3},
   149  	{"DR4", LBREG, x86.REG_DR + 4},
   150  	{"DR5", LBREG, x86.REG_DR + 5},
   151  	{"DR6", LBREG, x86.REG_DR + 6},
   152  	{"DR7", LBREG, x86.REG_DR + 7},
   153  	{"TR0", LBREG, x86.REG_TR + 0},
   154  	{"TR1", LBREG, x86.REG_TR + 1},
   155  	{"TR2", LBREG, x86.REG_TR + 2},
   156  	{"TR3", LBREG, x86.REG_TR + 3},
   157  	{"TR4", LBREG, x86.REG_TR + 4},
   158  	{"TR5", LBREG, x86.REG_TR + 5},
   159  	{"TR6", LBREG, x86.REG_TR + 6},
   160  	{"TR7", LBREG, x86.REG_TR + 7},
   161  	{"AAA", LTYPE0, x86.AAAA},
   162  	{"AAD", LTYPE0, x86.AAAD},
   163  	{"AAM", LTYPE0, x86.AAAM},
   164  	{"AAS", LTYPE0, x86.AAAS},
   165  	{"ADCB", LTYPE3, x86.AADCB},
   166  	{"ADCL", LTYPE3, x86.AADCL},
   167  	{"ADCW", LTYPE3, x86.AADCW},
   168  	{"ADDB", LTYPE3, x86.AADDB},
   169  	{"ADDL", LTYPE3, x86.AADDL},
   170  	{"ADDW", LTYPE3, x86.AADDW},
   171  	{"ADJSP", LTYPE2, x86.AADJSP},
   172  	{"ANDB", LTYPE3, x86.AANDB},
   173  	{"ANDL", LTYPE3, x86.AANDL},
   174  	{"ANDW", LTYPE3, x86.AANDW},
   175  	{"ARPL", LTYPE3, x86.AARPL},
   176  	{"BOUNDL", LTYPE3, x86.ABOUNDL},
   177  	{"BOUNDW", LTYPE3, x86.ABOUNDW},
   178  	{"BSFL", LTYPE3, x86.ABSFL},
   179  	{"BSFW", LTYPE3, x86.ABSFW},
   180  	{"BSRL", LTYPE3, x86.ABSRL},
   181  	{"BSRW", LTYPE3, x86.ABSRW},
   182  	{"BSWAPL", LTYPE1, x86.ABSWAPL},
   183  	{"BTCL", LTYPE3, x86.ABTCL},
   184  	{"BTCW", LTYPE3, x86.ABTCW},
   185  	{"BTL", LTYPE3, x86.ABTL},
   186  	{"BTRL", LTYPE3, x86.ABTRL},
   187  	{"BTRW", LTYPE3, x86.ABTRW},
   188  	{"BTSL", LTYPE3, x86.ABTSL},
   189  	{"BTSW", LTYPE3, x86.ABTSW},
   190  	{"BTW", LTYPE3, x86.ABTW},
   191  	{"BYTE", LTYPE2, x86.ABYTE},
   192  	{"CALL", LTYPEC, obj.ACALL},
   193  	{"CLC", LTYPE0, x86.ACLC},
   194  	{"CLD", LTYPE0, x86.ACLD},
   195  	{"CLI", LTYPE0, x86.ACLI},
   196  	{"CLTS", LTYPE0, x86.ACLTS},
   197  	{"CMC", LTYPE0, x86.ACMC},
   198  	{"CMPB", LTYPE4, x86.ACMPB},
   199  	{"CMPL", LTYPE4, x86.ACMPL},
   200  	{"CMPW", LTYPE4, x86.ACMPW},
   201  	{"CMPSB", LTYPE0, x86.ACMPSB},
   202  	{"CMPSL", LTYPE0, x86.ACMPSL},
   203  	{"CMPSW", LTYPE0, x86.ACMPSW},
   204  	{"CMPXCHG8B", LTYPE1, x86.ACMPXCHG8B},
   205  	{"CMPXCHGB", LTYPE3, x86.ACMPXCHGB},
   206  	{"CMPXCHGL", LTYPE3, x86.ACMPXCHGL},
   207  	{"CMPXCHGW", LTYPE3, x86.ACMPXCHGW},
   208  	{"CPUID", LTYPE0, x86.ACPUID},
   209  	{"DAA", LTYPE0, x86.ADAA},
   210  	{"DAS", LTYPE0, x86.ADAS},
   211  	{"DATA", LTYPED, obj.ADATA},
   212  	{"DECB", LTYPE1, x86.ADECB},
   213  	{"DECL", LTYPE1, x86.ADECL},
   214  	{"DECW", LTYPE1, x86.ADECW},
   215  	{"DIVB", LTYPE2, x86.ADIVB},
   216  	{"DIVL", LTYPE2, x86.ADIVL},
   217  	{"DIVW", LTYPE2, x86.ADIVW},
   218  	{"END", LTYPE0, obj.AEND},
   219  	{"ENTER", LTYPE2, x86.AENTER},
   220  	{"GLOBL", LTYPEG, obj.AGLOBL},
   221  	{"HLT", LTYPE0, x86.AHLT},
   222  	{"IDIVB", LTYPE2, x86.AIDIVB},
   223  	{"IDIVL", LTYPE2, x86.AIDIVL},
   224  	{"IDIVW", LTYPE2, x86.AIDIVW},
   225  	{"IMULB", LTYPE2, x86.AIMULB},
   226  	{"IMULL", LTYPEI, x86.AIMULL},
   227  	{"IMULW", LTYPEI, x86.AIMULW},
   228  	{"INB", LTYPE0, x86.AINB},
   229  	{"INL", LTYPE0, x86.AINL},
   230  	{"INW", LTYPE0, x86.AINW},
   231  	{"INCB", LTYPE1, x86.AINCB},
   232  	{"INCL", LTYPE1, x86.AINCL},
   233  	{"INCW", LTYPE1, x86.AINCW},
   234  	{"INSB", LTYPE0, x86.AINSB},
   235  	{"INSL", LTYPE0, x86.AINSL},
   236  	{"INSW", LTYPE0, x86.AINSW},
   237  	{"INT", LTYPE2, x86.AINT},
   238  	{"INTO", LTYPE0, x86.AINTO},
   239  	{"IRETL", LTYPE0, x86.AIRETL},
   240  	{"IRETW", LTYPE0, x86.AIRETW},
   241  	{"JOS", LTYPER, x86.AJOS},  /* overflow set (OF = 1) */
   242  	{"JO", LTYPER, x86.AJOS},   /* alternate */
   243  	{"JOC", LTYPER, x86.AJOC},  /* overflow clear (OF = 0) */
   244  	{"JNO", LTYPER, x86.AJOC},  /* alternate */
   245  	{"JCS", LTYPER, x86.AJCS},  /* carry set (CF = 1) */
   246  	{"JB", LTYPER, x86.AJCS},   /* alternate */
   247  	{"JC", LTYPER, x86.AJCS},   /* alternate */
   248  	{"JNAE", LTYPER, x86.AJCS}, /* alternate */
   249  	{"JLO", LTYPER, x86.AJCS},  /* alternate */
   250  	{"JCC", LTYPER, x86.AJCC},  /* carry clear (CF = 0) */
   251  	{"JAE", LTYPER, x86.AJCC},  /* alternate */
   252  	{"JNB", LTYPER, x86.AJCC},  /* alternate */
   253  	{"JNC", LTYPER, x86.AJCC},  /* alternate */
   254  	{"JHS", LTYPER, x86.AJCC},  /* alternate */
   255  	{"JEQ", LTYPER, x86.AJEQ},  /* equal (ZF = 1) */
   256  	{"JE", LTYPER, x86.AJEQ},   /* alternate */
   257  	{"JZ", LTYPER, x86.AJEQ},   /* alternate */
   258  	{"JNE", LTYPER, x86.AJNE},  /* not equal (ZF = 0) */
   259  	{"JNZ", LTYPER, x86.AJNE},  /* alternate */
   260  	{"JLS", LTYPER, x86.AJLS},  /* lower or same (unsigned) (CF = 1 || ZF = 1) */
   261  	{"JBE", LTYPER, x86.AJLS},  /* alternate */
   262  	{"JNA", LTYPER, x86.AJLS},  /* alternate */
   263  	{"JHI", LTYPER, x86.AJHI},  /* higher (unsigned) (CF = 0 && ZF = 0) */
   264  	{"JA", LTYPER, x86.AJHI},   /* alternate */
   265  	{"JNBE", LTYPER, x86.AJHI}, /* alternate */
   266  	{"JMI", LTYPER, x86.AJMI},  /* negative (minus) (SF = 1) */
   267  	{"JS", LTYPER, x86.AJMI},   /* alternate */
   268  	{"JPL", LTYPER, x86.AJPL},  /* non-negative (plus) (SF = 0) */
   269  	{"JNS", LTYPER, x86.AJPL},  /* alternate */
   270  	{"JPS", LTYPER, x86.AJPS},  /* parity set (PF = 1) */
   271  	{"JP", LTYPER, x86.AJPS},   /* alternate */
   272  	{"JPE", LTYPER, x86.AJPS},  /* alternate */
   273  	{"JPC", LTYPER, x86.AJPC},  /* parity clear (PF = 0) */
   274  	{"JNP", LTYPER, x86.AJPC},  /* alternate */
   275  	{"JPO", LTYPER, x86.AJPC},  /* alternate */
   276  	{"JLT", LTYPER, x86.AJLT},  /* less than (signed) (SF != OF) */
   277  	{"JL", LTYPER, x86.AJLT},   /* alternate */
   278  	{"JNGE", LTYPER, x86.AJLT}, /* alternate */
   279  	{"JGE", LTYPER, x86.AJGE},  /* greater than or equal (signed) (SF = OF) */
   280  	{"JNL", LTYPER, x86.AJGE},  /* alternate */
   281  	{"JLE", LTYPER, x86.AJLE},  /* less than or equal (signed) (ZF = 1 || SF != OF) */
   282  	{"JNG", LTYPER, x86.AJLE},  /* alternate */
   283  	{"JGT", LTYPER, x86.AJGT},  /* greater than (signed) (ZF = 0 && SF = OF) */
   284  	{"JG", LTYPER, x86.AJGT},   /* alternate */
   285  	{"JNLE", LTYPER, x86.AJGT}, /* alternate */
   286  	{"JCXZL", LTYPER, x86.AJCXZL},
   287  	{"JCXZW", LTYPER, x86.AJCXZW},
   288  	{"JMP", LTYPEC, obj.AJMP},
   289  	{"LAHF", LTYPE0, x86.ALAHF},
   290  	{"LARL", LTYPE3, x86.ALARL},
   291  	{"LARW", LTYPE3, x86.ALARW},
   292  	{"LEAL", LTYPE3, x86.ALEAL},
   293  	{"LEAW", LTYPE3, x86.ALEAW},
   294  	{"LEAVEL", LTYPE0, x86.ALEAVEL},
   295  	{"LEAVEW", LTYPE0, x86.ALEAVEW},
   296  	{"LOCK", LTYPE0, x86.ALOCK},
   297  	{"LODSB", LTYPE0, x86.ALODSB},
   298  	{"LODSL", LTYPE0, x86.ALODSL},
   299  	{"LODSW", LTYPE0, x86.ALODSW},
   300  	{"LONG", LTYPE2, x86.ALONG},
   301  	{"LOOP", LTYPER, x86.ALOOP},
   302  	{"LOOPEQ", LTYPER, x86.ALOOPEQ},
   303  	{"LOOPNE", LTYPER, x86.ALOOPNE},
   304  	{"LSLL", LTYPE3, x86.ALSLL},
   305  	{"LSLW", LTYPE3, x86.ALSLW},
   306  	{"MOVB", LTYPE3, x86.AMOVB},
   307  	{"MOVL", LTYPEM, x86.AMOVL},
   308  	{"MOVW", LTYPEM, x86.AMOVW},
   309  	{"MOVQ", LTYPEM, x86.AMOVQ},
   310  	{"MOVBLSX", LTYPE3, x86.AMOVBLSX},
   311  	{"MOVBLZX", LTYPE3, x86.AMOVBLZX},
   312  	{"MOVBWSX", LTYPE3, x86.AMOVBWSX},
   313  	{"MOVBWZX", LTYPE3, x86.AMOVBWZX},
   314  	{"MOVWLSX", LTYPE3, x86.AMOVWLSX},
   315  	{"MOVWLZX", LTYPE3, x86.AMOVWLZX},
   316  	{"MOVSB", LTYPE0, x86.AMOVSB},
   317  	{"MOVSL", LTYPE0, x86.AMOVSL},
   318  	{"MOVSW", LTYPE0, x86.AMOVSW},
   319  	{"MULB", LTYPE2, x86.AMULB},
   320  	{"MULL", LTYPE2, x86.AMULL},
   321  	{"MULW", LTYPE2, x86.AMULW},
   322  	{"NEGB", LTYPE1, x86.ANEGB},
   323  	{"NEGL", LTYPE1, x86.ANEGL},
   324  	{"NEGW", LTYPE1, x86.ANEGW},
   325  	{"NOP", LTYPEN, obj.ANOP},
   326  	{"NOTB", LTYPE1, x86.ANOTB},
   327  	{"NOTL", LTYPE1, x86.ANOTL},
   328  	{"NOTW", LTYPE1, x86.ANOTW},
   329  	{"ORB", LTYPE3, x86.AORB},
   330  	{"ORL", LTYPE3, x86.AORL},
   331  	{"ORW", LTYPE3, x86.AORW},
   332  	{"OUTB", LTYPE0, x86.AOUTB},
   333  	{"OUTL", LTYPE0, x86.AOUTL},
   334  	{"OUTW", LTYPE0, x86.AOUTW},
   335  	{"OUTSB", LTYPE0, x86.AOUTSB},
   336  	{"OUTSL", LTYPE0, x86.AOUTSL},
   337  	{"OUTSW", LTYPE0, x86.AOUTSW},
   338  	{"PAUSE", LTYPEN, x86.APAUSE},
   339  	{"PINSRD", LTYPEX, x86.APINSRD},
   340  	{"POPAL", LTYPE0, x86.APOPAL},
   341  	{"POPAW", LTYPE0, x86.APOPAW},
   342  	{"POPFL", LTYPE0, x86.APOPFL},
   343  	{"POPFW", LTYPE0, x86.APOPFW},
   344  	{"POPL", LTYPE1, x86.APOPL},
   345  	{"POPW", LTYPE1, x86.APOPW},
   346  	{"PUSHAL", LTYPE0, x86.APUSHAL},
   347  	{"PUSHAW", LTYPE0, x86.APUSHAW},
   348  	{"PUSHFL", LTYPE0, x86.APUSHFL},
   349  	{"PUSHFW", LTYPE0, x86.APUSHFW},
   350  	{"PUSHL", LTYPE2, x86.APUSHL},
   351  	{"PUSHW", LTYPE2, x86.APUSHW},
   352  	{"RCLB", LTYPE3, x86.ARCLB},
   353  	{"RCLL", LTYPE3, x86.ARCLL},
   354  	{"RCLW", LTYPE3, x86.ARCLW},
   355  	{"RCRB", LTYPE3, x86.ARCRB},
   356  	{"RCRL", LTYPE3, x86.ARCRL},
   357  	{"RCRW", LTYPE3, x86.ARCRW},
   358  	{"RDTSC", LTYPE0, x86.ARDTSC},
   359  	{"REP", LTYPE0, x86.AREP},
   360  	{"REPN", LTYPE0, x86.AREPN},
   361  	{"RET", LTYPE0, obj.ARET},
   362  	{"ROLB", LTYPE3, x86.AROLB},
   363  	{"ROLL", LTYPE3, x86.AROLL},
   364  	{"ROLW", LTYPE3, x86.AROLW},
   365  	{"RORB", LTYPE3, x86.ARORB},
   366  	{"RORL", LTYPE3, x86.ARORL},
   367  	{"RORW", LTYPE3, x86.ARORW},
   368  	{"SAHF", LTYPE0, x86.ASAHF},
   369  	{"SALB", LTYPE3, x86.ASALB},
   370  	{"SALL", LTYPE3, x86.ASALL},
   371  	{"SALW", LTYPE3, x86.ASALW},
   372  	{"SARB", LTYPE3, x86.ASARB},
   373  	{"SARL", LTYPE3, x86.ASARL},
   374  	{"SARW", LTYPE3, x86.ASARW},
   375  	{"SBBB", LTYPE3, x86.ASBBB},
   376  	{"SBBL", LTYPE3, x86.ASBBL},
   377  	{"SBBW", LTYPE3, x86.ASBBW},
   378  	{"SCASB", LTYPE0, x86.ASCASB},
   379  	{"SCASL", LTYPE0, x86.ASCASL},
   380  	{"SCASW", LTYPE0, x86.ASCASW},
   381  	{"SETCC", LTYPE1, x86.ASETCC}, /* see JCC etc above for condition codes */
   382  	{"SETCS", LTYPE1, x86.ASETCS},
   383  	{"SETEQ", LTYPE1, x86.ASETEQ},
   384  	{"SETGE", LTYPE1, x86.ASETGE},
   385  	{"SETGT", LTYPE1, x86.ASETGT},
   386  	{"SETHI", LTYPE1, x86.ASETHI},
   387  	{"SETLE", LTYPE1, x86.ASETLE},
   388  	{"SETLS", LTYPE1, x86.ASETLS},
   389  	{"SETLT", LTYPE1, x86.ASETLT},
   390  	{"SETMI", LTYPE1, x86.ASETMI},
   391  	{"SETNE", LTYPE1, x86.ASETNE},
   392  	{"SETOC", LTYPE1, x86.ASETOC},
   393  	{"SETOS", LTYPE1, x86.ASETOS},
   394  	{"SETPC", LTYPE1, x86.ASETPC},
   395  	{"SETPL", LTYPE1, x86.ASETPL},
   396  	{"SETPS", LTYPE1, x86.ASETPS},
   397  	{"CDQ", LTYPE0, x86.ACDQ},
   398  	{"CWD", LTYPE0, x86.ACWD},
   399  	{"SHLB", LTYPE3, x86.ASHLB},
   400  	{"SHLL", LTYPES, x86.ASHLL},
   401  	{"SHLW", LTYPES, x86.ASHLW},
   402  	{"SHRB", LTYPE3, x86.ASHRB},
   403  	{"SHRL", LTYPES, x86.ASHRL},
   404  	{"SHRW", LTYPES, x86.ASHRW},
   405  	{"STC", LTYPE0, x86.ASTC},
   406  	{"STD", LTYPE0, x86.ASTD},
   407  	{"STI", LTYPE0, x86.ASTI},
   408  	{"STOSB", LTYPE0, x86.ASTOSB},
   409  	{"STOSL", LTYPE0, x86.ASTOSL},
   410  	{"STOSW", LTYPE0, x86.ASTOSW},
   411  	{"SUBB", LTYPE3, x86.ASUBB},
   412  	{"SUBL", LTYPE3, x86.ASUBL},
   413  	{"SUBW", LTYPE3, x86.ASUBW},
   414  	{"SYSCALL", LTYPE0, x86.ASYSCALL},
   415  	{"TESTB", LTYPE3, x86.ATESTB},
   416  	{"TESTL", LTYPE3, x86.ATESTL},
   417  	{"TESTW", LTYPE3, x86.ATESTW},
   418  	{"TEXT", LTYPET, obj.ATEXT},
   419  	{"VERR", LTYPE2, x86.AVERR},
   420  	{"VERW", LTYPE2, x86.AVERW},
   421  	{"WAIT", LTYPE0, x86.AWAIT},
   422  	{"WORD", LTYPE2, x86.AWORD},
   423  	{"XADDB", LTYPE3, x86.AXADDB},
   424  	{"XADDL", LTYPE3, x86.AXADDL},
   425  	{"XADDW", LTYPE3, x86.AXADDW},
   426  	{"XCHGB", LTYPE3, x86.AXCHGB},
   427  	{"XCHGL", LTYPE3, x86.AXCHGL},
   428  	{"XCHGW", LTYPE3, x86.AXCHGW},
   429  	{"XLAT", LTYPE2, x86.AXLAT},
   430  	{"XORB", LTYPE3, x86.AXORB},
   431  	{"XORL", LTYPE3, x86.AXORL},
   432  	{"XORW", LTYPE3, x86.AXORW},
   433  	{"CMOVLCC", LTYPE3, x86.ACMOVLCC},
   434  	{"CMOVLCS", LTYPE3, x86.ACMOVLCS},
   435  	{"CMOVLEQ", LTYPE3, x86.ACMOVLEQ},
   436  	{"CMOVLGE", LTYPE3, x86.ACMOVLGE},
   437  	{"CMOVLGT", LTYPE3, x86.ACMOVLGT},
   438  	{"CMOVLHI", LTYPE3, x86.ACMOVLHI},
   439  	{"CMOVLLE", LTYPE3, x86.ACMOVLLE},
   440  	{"CMOVLLS", LTYPE3, x86.ACMOVLLS},
   441  	{"CMOVLLT", LTYPE3, x86.ACMOVLLT},
   442  	{"CMOVLMI", LTYPE3, x86.ACMOVLMI},
   443  	{"CMOVLNE", LTYPE3, x86.ACMOVLNE},
   444  	{"CMOVLOC", LTYPE3, x86.ACMOVLOC},
   445  	{"CMOVLOS", LTYPE3, x86.ACMOVLOS},
   446  	{"CMOVLPC", LTYPE3, x86.ACMOVLPC},
   447  	{"CMOVLPL", LTYPE3, x86.ACMOVLPL},
   448  	{"CMOVLPS", LTYPE3, x86.ACMOVLPS},
   449  	{"CMOVWCC", LTYPE3, x86.ACMOVWCC},
   450  	{"CMOVWCS", LTYPE3, x86.ACMOVWCS},
   451  	{"CMOVWEQ", LTYPE3, x86.ACMOVWEQ},
   452  	{"CMOVWGE", LTYPE3, x86.ACMOVWGE},
   453  	{"CMOVWGT", LTYPE3, x86.ACMOVWGT},
   454  	{"CMOVWHI", LTYPE3, x86.ACMOVWHI},
   455  	{"CMOVWLE", LTYPE3, x86.ACMOVWLE},
   456  	{"CMOVWLS", LTYPE3, x86.ACMOVWLS},
   457  	{"CMOVWLT", LTYPE3, x86.ACMOVWLT},
   458  	{"CMOVWMI", LTYPE3, x86.ACMOVWMI},
   459  	{"CMOVWNE", LTYPE3, x86.ACMOVWNE},
   460  	{"CMOVWOC", LTYPE3, x86.ACMOVWOC},
   461  	{"CMOVWOS", LTYPE3, x86.ACMOVWOS},
   462  	{"CMOVWPC", LTYPE3, x86.ACMOVWPC},
   463  	{"CMOVWPL", LTYPE3, x86.ACMOVWPL},
   464  	{"CMOVWPS", LTYPE3, x86.ACMOVWPS},
   465  	{"FMOVB", LTYPE3, x86.AFMOVB},
   466  	{"FMOVBP", LTYPE3, x86.AFMOVBP},
   467  	{"FMOVD", LTYPE3, x86.AFMOVD},
   468  	{"FMOVDP", LTYPE3, x86.AFMOVDP},
   469  	{"FMOVF", LTYPE3, x86.AFMOVF},
   470  	{"FMOVFP", LTYPE3, x86.AFMOVFP},
   471  	{"FMOVL", LTYPE3, x86.AFMOVL},
   472  	{"FMOVLP", LTYPE3, x86.AFMOVLP},
   473  	{"FMOVV", LTYPE3, x86.AFMOVV},
   474  	{"FMOVVP", LTYPE3, x86.AFMOVVP},
   475  	{"FMOVW", LTYPE3, x86.AFMOVW},
   476  	{"FMOVWP", LTYPE3, x86.AFMOVWP},
   477  	{"FMOVX", LTYPE3, x86.AFMOVX},
   478  	{"FMOVXP", LTYPE3, x86.AFMOVXP},
   479  	{"FCMOVCC", LTYPE3, x86.AFCMOVCC},
   480  	{"FCMOVCS", LTYPE3, x86.AFCMOVCS},
   481  	{"FCMOVEQ", LTYPE3, x86.AFCMOVEQ},
   482  	{"FCMOVHI", LTYPE3, x86.AFCMOVHI},
   483  	{"FCMOVLS", LTYPE3, x86.AFCMOVLS},
   484  	{"FCMOVNE", LTYPE3, x86.AFCMOVNE},
   485  	{"FCMOVNU", LTYPE3, x86.AFCMOVNU},
   486  	{"FCMOVUN", LTYPE3, x86.AFCMOVUN},
   487  	{"FCOMB", LTYPE3, x86.AFCOMB},
   488  	{"FCOMBP", LTYPE3, x86.AFCOMBP},
   489  	{"FCOMD", LTYPE3, x86.AFCOMD},
   490  	{"FCOMDP", LTYPE3, x86.AFCOMDP},
   491  	{"FCOMDPP", LTYPE3, x86.AFCOMDPP},
   492  	{"FCOMF", LTYPE3, x86.AFCOMF},
   493  	{"FCOMFP", LTYPE3, x86.AFCOMFP},
   494  	{"FCOMI", LTYPE3, x86.AFCOMI},
   495  	{"FCOMIP", LTYPE3, x86.AFCOMIP},
   496  	{"FCOML", LTYPE3, x86.AFCOML},
   497  	{"FCOMLP", LTYPE3, x86.AFCOMLP},
   498  	{"FCOMW", LTYPE3, x86.AFCOMW},
   499  	{"FCOMWP", LTYPE3, x86.AFCOMWP},
   500  	{"FUCOM", LTYPE3, x86.AFUCOM},
   501  	{"FUCOMI", LTYPE3, x86.AFUCOMI},
   502  	{"FUCOMIP", LTYPE3, x86.AFUCOMIP},
   503  	{"FUCOMP", LTYPE3, x86.AFUCOMP},
   504  	{"FUCOMPP", LTYPE3, x86.AFUCOMPP},
   505  	{"FADDW", LTYPE3, x86.AFADDW},
   506  	{"FADDL", LTYPE3, x86.AFADDL},
   507  	{"FADDF", LTYPE3, x86.AFADDF},
   508  	{"FADDD", LTYPE3, x86.AFADDD},
   509  	{"FADDDP", LTYPE3, x86.AFADDDP},
   510  	{"FSUBDP", LTYPE3, x86.AFSUBDP},
   511  	{"FSUBW", LTYPE3, x86.AFSUBW},
   512  	{"FSUBL", LTYPE3, x86.AFSUBL},
   513  	{"FSUBF", LTYPE3, x86.AFSUBF},
   514  	{"FSUBD", LTYPE3, x86.AFSUBD},
   515  	{"FSUBRDP", LTYPE3, x86.AFSUBRDP},
   516  	{"FSUBRW", LTYPE3, x86.AFSUBRW},
   517  	{"FSUBRL", LTYPE3, x86.AFSUBRL},
   518  	{"FSUBRF", LTYPE3, x86.AFSUBRF},
   519  	{"FSUBRD", LTYPE3, x86.AFSUBRD},
   520  	{"FMULDP", LTYPE3, x86.AFMULDP},
   521  	{"FMULW", LTYPE3, x86.AFMULW},
   522  	{"FMULL", LTYPE3, x86.AFMULL},
   523  	{"FMULF", LTYPE3, x86.AFMULF},
   524  	{"FMULD", LTYPE3, x86.AFMULD},
   525  	{"FDIVDP", LTYPE3, x86.AFDIVDP},
   526  	{"FDIVW", LTYPE3, x86.AFDIVW},
   527  	{"FDIVL", LTYPE3, x86.AFDIVL},
   528  	{"FDIVF", LTYPE3, x86.AFDIVF},
   529  	{"FDIVD", LTYPE3, x86.AFDIVD},
   530  	{"FDIVRDP", LTYPE3, x86.AFDIVRDP},
   531  	{"FDIVRW", LTYPE3, x86.AFDIVRW},
   532  	{"FDIVRL", LTYPE3, x86.AFDIVRL},
   533  	{"FDIVRF", LTYPE3, x86.AFDIVRF},
   534  	{"FDIVRD", LTYPE3, x86.AFDIVRD},
   535  	{"FXCHD", LTYPE3, x86.AFXCHD},
   536  	{"FFREE", LTYPE1, x86.AFFREE},
   537  	{"FLDCW", LTYPE2, x86.AFLDCW},
   538  	{"FLDENV", LTYPE1, x86.AFLDENV},
   539  	{"FRSTOR", LTYPE2, x86.AFRSTOR},
   540  	{"FSAVE", LTYPE1, x86.AFSAVE},
   541  	{"FSTCW", LTYPE1, x86.AFSTCW},
   542  	{"FSTENV", LTYPE1, x86.AFSTENV},
   543  	{"FSTSW", LTYPE1, x86.AFSTSW},
   544  	{"F2XM1", LTYPE0, x86.AF2XM1},
   545  	{"FABS", LTYPE0, x86.AFABS},
   546  	{"FCHS", LTYPE0, x86.AFCHS},
   547  	{"FCLEX", LTYPE0, x86.AFCLEX},
   548  	{"FCOS", LTYPE0, x86.AFCOS},
   549  	{"FDECSTP", LTYPE0, x86.AFDECSTP},
   550  	{"FINCSTP", LTYPE0, x86.AFINCSTP},
   551  	{"FINIT", LTYPE0, x86.AFINIT},
   552  	{"FLD1", LTYPE0, x86.AFLD1},
   553  	{"FLDL2E", LTYPE0, x86.AFLDL2E},
   554  	{"FLDL2T", LTYPE0, x86.AFLDL2T},
   555  	{"FLDLG2", LTYPE0, x86.AFLDLG2},
   556  	{"FLDLN2", LTYPE0, x86.AFLDLN2},
   557  	{"FLDPI", LTYPE0, x86.AFLDPI},
   558  	{"FLDZ", LTYPE0, x86.AFLDZ},
   559  	{"FNOP", LTYPE0, x86.AFNOP},
   560  	{"FPATAN", LTYPE0, x86.AFPATAN},
   561  	{"FPREM", LTYPE0, x86.AFPREM},
   562  	{"FPREM1", LTYPE0, x86.AFPREM1},
   563  	{"FPTAN", LTYPE0, x86.AFPTAN},
   564  	{"FRNDINT", LTYPE0, x86.AFRNDINT},
   565  	{"FSCALE", LTYPE0, x86.AFSCALE},
   566  	{"FSIN", LTYPE0, x86.AFSIN},
   567  	{"FSINCOS", LTYPE0, x86.AFSINCOS},
   568  	{"FSQRT", LTYPE0, x86.AFSQRT},
   569  	{"FTST", LTYPE0, x86.AFTST},
   570  	{"FXAM", LTYPE0, x86.AFXAM},
   571  	{"FXTRACT", LTYPE0, x86.AFXTRACT},
   572  	{"FYL2X", LTYPE0, x86.AFYL2X},
   573  	{"FYL2XP1", LTYPE0, x86.AFYL2XP1},
   574  	{"LFENCE", LTYPE0, x86.ALFENCE},
   575  	{"MFENCE", LTYPE0, x86.AMFENCE},
   576  	{"SFENCE", LTYPE0, x86.ASFENCE},
   577  	{"EMMS", LTYPE0, x86.AEMMS},
   578  	{"PREFETCHT0", LTYPE2, x86.APREFETCHT0},
   579  	{"PREFETCHT1", LTYPE2, x86.APREFETCHT1},
   580  	{"PREFETCHT2", LTYPE2, x86.APREFETCHT2},
   581  	{"PREFETCHNTA", LTYPE2, x86.APREFETCHNTA},
   582  	{"UNDEF", LTYPE0, obj.AUNDEF},
   583  	{"ADDPD", LTYPE3, x86.AADDPD},
   584  	{"ADDPS", LTYPE3, x86.AADDPS},
   585  	{"ADDSD", LTYPE3, x86.AADDSD},
   586  	{"ADDSS", LTYPE3, x86.AADDSS},
   587  	{"AESENC", LTYPE3, x86.AAESENC},
   588  	{"ANDNPD", LTYPE3, x86.AANDNPD},
   589  	{"ANDNPS", LTYPE3, x86.AANDNPS},
   590  	{"ANDPD", LTYPE3, x86.AANDPD},
   591  	{"ANDPS", LTYPE3, x86.AANDPS},
   592  	{"CMPPD", LTYPEXC, x86.ACMPPD},
   593  	{"CMPPS", LTYPEXC, x86.ACMPPS},
   594  	{"CMPSD", LTYPEXC, x86.ACMPSD},
   595  	{"CMPSS", LTYPEXC, x86.ACMPSS},
   596  	{"COMISD", LTYPE3, x86.ACOMISD},
   597  	{"COMISS", LTYPE3, x86.ACOMISS},
   598  	{"CVTPL2PD", LTYPE3, x86.ACVTPL2PD},
   599  	{"CVTPL2PS", LTYPE3, x86.ACVTPL2PS},
   600  	{"CVTPD2PL", LTYPE3, x86.ACVTPD2PL},
   601  	{"CVTPD2PS", LTYPE3, x86.ACVTPD2PS},
   602  	{"CVTPS2PL", LTYPE3, x86.ACVTPS2PL},
   603  	{"CVTPS2PD", LTYPE3, x86.ACVTPS2PD},
   604  	{"CVTSD2SL", LTYPE3, x86.ACVTSD2SL},
   605  	{"CVTSD2SS", LTYPE3, x86.ACVTSD2SS},
   606  	{"CVTSL2SD", LTYPE3, x86.ACVTSL2SD},
   607  	{"CVTSL2SS", LTYPE3, x86.ACVTSL2SS},
   608  	{"CVTSS2SD", LTYPE3, x86.ACVTSS2SD},
   609  	{"CVTSS2SL", LTYPE3, x86.ACVTSS2SL},
   610  	{"CVTTPD2PL", LTYPE3, x86.ACVTTPD2PL},
   611  	{"CVTTPS2PL", LTYPE3, x86.ACVTTPS2PL},
   612  	{"CVTTSD2SL", LTYPE3, x86.ACVTTSD2SL},
   613  	{"CVTTSS2SL", LTYPE3, x86.ACVTTSS2SL},
   614  	{"DIVPD", LTYPE3, x86.ADIVPD},
   615  	{"DIVPS", LTYPE3, x86.ADIVPS},
   616  	{"DIVSD", LTYPE3, x86.ADIVSD},
   617  	{"DIVSS", LTYPE3, x86.ADIVSS},
   618  	{"MASKMOVOU", LTYPE3, x86.AMASKMOVOU},
   619  	{"MASKMOVDQU", LTYPE3, x86.AMASKMOVOU}, /* syn */
   620  	{"MAXPD", LTYPE3, x86.AMAXPD},
   621  	{"MAXPS", LTYPE3, x86.AMAXPS},
   622  	{"MAXSD", LTYPE3, x86.AMAXSD},
   623  	{"MAXSS", LTYPE3, x86.AMAXSS},
   624  	{"MINPD", LTYPE3, x86.AMINPD},
   625  	{"MINPS", LTYPE3, x86.AMINPS},
   626  	{"MINSD", LTYPE3, x86.AMINSD},
   627  	{"MINSS", LTYPE3, x86.AMINSS},
   628  	{"MOVAPD", LTYPE3, x86.AMOVAPD},
   629  	{"MOVAPS", LTYPE3, x86.AMOVAPS},
   630  	{"MOVO", LTYPE3, x86.AMOVO},
   631  	{"MOVOA", LTYPE3, x86.AMOVO}, /* syn */
   632  	{"MOVOU", LTYPE3, x86.AMOVOU},
   633  	{"MOVHLPS", LTYPE3, x86.AMOVHLPS},
   634  	{"MOVHPD", LTYPE3, x86.AMOVHPD},
   635  	{"MOVHPS", LTYPE3, x86.AMOVHPS},
   636  	{"MOVLHPS", LTYPE3, x86.AMOVLHPS},
   637  	{"MOVLPD", LTYPE3, x86.AMOVLPD},
   638  	{"MOVLPS", LTYPE3, x86.AMOVLPS},
   639  	{"MOVMSKPD", LTYPE3, x86.AMOVMSKPD},
   640  	{"MOVMSKPS", LTYPE3, x86.AMOVMSKPS},
   641  	{"MOVNTO", LTYPE3, x86.AMOVNTO},
   642  	{"MOVNTDQ", LTYPE3, x86.AMOVNTO}, /* syn */
   643  	{"MOVNTPD", LTYPE3, x86.AMOVNTPD},
   644  	{"MOVNTPS", LTYPE3, x86.AMOVNTPS},
   645  	{"MOVSD", LTYPE3, x86.AMOVSD},
   646  	{"MOVSS", LTYPE3, x86.AMOVSS},
   647  	{"MOVUPD", LTYPE3, x86.AMOVUPD},
   648  	{"MOVUPS", LTYPE3, x86.AMOVUPS},
   649  	{"MULPD", LTYPE3, x86.AMULPD},
   650  	{"MULPS", LTYPE3, x86.AMULPS},
   651  	{"MULSD", LTYPE3, x86.AMULSD},
   652  	{"MULSS", LTYPE3, x86.AMULSS},
   653  	{"ORPD", LTYPE3, x86.AORPD},
   654  	{"ORPS", LTYPE3, x86.AORPS},
   655  	{"PADDQ", LTYPE3, x86.APADDQ},
   656  	{"PAND", LTYPE3, x86.APAND},
   657  	{"PCMPEQB", LTYPE3, x86.APCMPEQB},
   658  	{"PMAXSW", LTYPE3, x86.APMAXSW},
   659  	{"PMAXUB", LTYPE3, x86.APMAXUB},
   660  	{"PMINSW", LTYPE3, x86.APMINSW},
   661  	{"PMINUB", LTYPE3, x86.APMINUB},
   662  	{"PMOVMSKB", LTYPE3, x86.APMOVMSKB},
   663  	{"PSADBW", LTYPE3, x86.APSADBW},
   664  	{"PSHUFB", LTYPE3, x86.APSHUFB},
   665  	{"PSHUFHW", LTYPEX, x86.APSHUFHW},
   666  	{"PSHUFL", LTYPEX, x86.APSHUFL},
   667  	{"PSHUFLW", LTYPEX, x86.APSHUFLW},
   668  	{"PSUBB", LTYPE3, x86.APSUBB},
   669  	{"PSUBL", LTYPE3, x86.APSUBL},
   670  	{"PSUBQ", LTYPE3, x86.APSUBQ},
   671  	{"PSUBSB", LTYPE3, x86.APSUBSB},
   672  	{"PSUBSW", LTYPE3, x86.APSUBSW},
   673  	{"PSUBUSB", LTYPE3, x86.APSUBUSB},
   674  	{"PSUBUSW", LTYPE3, x86.APSUBUSW},
   675  	{"PSUBW", LTYPE3, x86.APSUBW},
   676  	{"PUNPCKHQDQ", LTYPE3, x86.APUNPCKHQDQ},
   677  	{"PUNPCKLQDQ", LTYPE3, x86.APUNPCKLQDQ},
   678  	{"PXOR", LTYPE3, x86.APXOR},
   679  	{"RCPPS", LTYPE3, x86.ARCPPS},
   680  	{"RCPSS", LTYPE3, x86.ARCPSS},
   681  	{"RSQRTPS", LTYPE3, x86.ARSQRTPS},
   682  	{"RSQRTSS", LTYPE3, x86.ARSQRTSS},
   683  	{"SQRTPD", LTYPE3, x86.ASQRTPD},
   684  	{"SQRTPS", LTYPE3, x86.ASQRTPS},
   685  	{"SQRTSD", LTYPE3, x86.ASQRTSD},
   686  	{"SQRTSS", LTYPE3, x86.ASQRTSS},
   687  	{"SUBPD", LTYPE3, x86.ASUBPD},
   688  	{"SUBPS", LTYPE3, x86.ASUBPS},
   689  	{"SUBSD", LTYPE3, x86.ASUBSD},
   690  	{"SUBSS", LTYPE3, x86.ASUBSS},
   691  	{"UCOMISD", LTYPE3, x86.AUCOMISD},
   692  	{"UCOMISS", LTYPE3, x86.AUCOMISS},
   693  	{"UNPCKHPD", LTYPE3, x86.AUNPCKHPD},
   694  	{"UNPCKHPS", LTYPE3, x86.AUNPCKHPS},
   695  	{"UNPCKLPD", LTYPE3, x86.AUNPCKLPD},
   696  	{"UNPCKLPS", LTYPE3, x86.AUNPCKLPS},
   697  	{"XORPD", LTYPE3, x86.AXORPD},
   698  	{"XORPS", LTYPE3, x86.AXORPS},
   699  	{"USEFIELD", LTYPEN, obj.AUSEFIELD},
   700  	{"PCDATA", LTYPEPC, obj.APCDATA},
   701  	{"FUNCDATA", LTYPEF, obj.AFUNCDATA},
   702  }
   703  
   704  func cinit() {
   705  	nullgen.Type = x86.REG_NONE
   706  	nullgen.Index = x86.REG_NONE
   707  }
   708  
   709  func checkscale(scale int16) {
   710  	switch scale {
   711  	case 1,
   712  		2,
   713  		4,
   714  		8:
   715  		return
   716  	}
   717  
   718  	yyerror("scale must be 1248: %d", scale)
   719  }
   720  
   721  func syminit(s *asm.Sym) {
   722  	s.Type = LNAME
   723  	s.Value = 0
   724  }
   725  
   726  func cclean() {
   727  	var g2 Addr2
   728  
   729  	g2.from = nullgen
   730  	g2.to = nullgen
   731  	outcode(obj.AEND, &g2)
   732  }
   733  
   734  var lastpc *obj.Prog
   735  
   736  type Addr2 struct {
   737  	from obj.Addr
   738  	to   obj.Addr
   739  }
   740  
   741  func outcode(a int, g2 *Addr2) {
   742  	var p *obj.Prog
   743  	var pl *obj.Plist
   744  
   745  	if asm.Pass == 1 {
   746  		goto out
   747  	}
   748  
   749  	p = new(obj.Prog)
   750  	*p = obj.Prog{}
   751  	p.Ctxt = asm.Ctxt
   752  	p.As = int16(a)
   753  	p.Lineno = stmtline
   754  	p.From = g2.from
   755  	p.To = g2.to
   756  	p.Pc = int64(asm.PC)
   757  
   758  	if lastpc == nil {
   759  		pl = obj.Linknewplist(asm.Ctxt)
   760  		pl.Firstpc = p
   761  	} else {
   762  
   763  		lastpc.Link = p
   764  	}
   765  	lastpc = p
   766  
   767  out:
   768  	if a != obj.AGLOBL && a != obj.ADATA {
   769  		asm.PC++
   770  	}
   771  }