]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/new8a/lex.go
[dev.cc] cmd/new5a etc, cmd/internal/asm: edit to produce working Go code
[gostls13.git] / src / cmd / new8a / lex.go
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/i386"
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 = &i386.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, i386.D_AUTO},
90         {"SB", LSB, i386.D_EXTERN},
91         {"FP", LFP, i386.D_PARAM},
92         {"PC", LPC, i386.D_BRANCH},
93         {"AL", LBREG, i386.D_AL},
94         {"CL", LBREG, i386.D_CL},
95         {"DL", LBREG, i386.D_DL},
96         {"BL", LBREG, i386.D_BL},
97         {"AH", LBREG, i386.D_AH},
98         {"CH", LBREG, i386.D_CH},
99         {"DH", LBREG, i386.D_DH},
100         {"BH", LBREG, i386.D_BH},
101         {"AX", LLREG, i386.D_AX},
102         {"CX", LLREG, i386.D_CX},
103         {"DX", LLREG, i386.D_DX},
104         {"BX", LLREG, i386.D_BX},
105         /*      "SP",           LLREG,  D_SP,   */
106         {"BP", LLREG, i386.D_BP},
107         {"SI", LLREG, i386.D_SI},
108         {"DI", LLREG, i386.D_DI},
109         {"F0", LFREG, i386.D_F0 + 0},
110         {"F1", LFREG, i386.D_F0 + 1},
111         {"F2", LFREG, i386.D_F0 + 2},
112         {"F3", LFREG, i386.D_F0 + 3},
113         {"F4", LFREG, i386.D_F0 + 4},
114         {"F5", LFREG, i386.D_F0 + 5},
115         {"F6", LFREG, i386.D_F0 + 6},
116         {"F7", LFREG, i386.D_F0 + 7},
117         {"X0", LXREG, i386.D_X0 + 0},
118         {"X1", LXREG, i386.D_X0 + 1},
119         {"X2", LXREG, i386.D_X0 + 2},
120         {"X3", LXREG, i386.D_X0 + 3},
121         {"X4", LXREG, i386.D_X0 + 4},
122         {"X5", LXREG, i386.D_X0 + 5},
123         {"X6", LXREG, i386.D_X0 + 6},
124         {"X7", LXREG, i386.D_X0 + 7},
125         {"CS", LSREG, i386.D_CS},
126         {"SS", LSREG, i386.D_SS},
127         {"DS", LSREG, i386.D_DS},
128         {"ES", LSREG, i386.D_ES},
129         {"FS", LSREG, i386.D_FS},
130         {"GS", LSREG, i386.D_GS},
131         {"TLS", LSREG, i386.D_TLS},
132         {"GDTR", LBREG, i386.D_GDTR},
133         {"IDTR", LBREG, i386.D_IDTR},
134         {"LDTR", LBREG, i386.D_LDTR},
135         {"MSW", LBREG, i386.D_MSW},
136         {"TASK", LBREG, i386.D_TASK},
137         {"CR0", LBREG, i386.D_CR + 0},
138         {"CR1", LBREG, i386.D_CR + 1},
139         {"CR2", LBREG, i386.D_CR + 2},
140         {"CR3", LBREG, i386.D_CR + 3},
141         {"CR4", LBREG, i386.D_CR + 4},
142         {"CR5", LBREG, i386.D_CR + 5},
143         {"CR6", LBREG, i386.D_CR + 6},
144         {"CR7", LBREG, i386.D_CR + 7},
145         {"DR0", LBREG, i386.D_DR + 0},
146         {"DR1", LBREG, i386.D_DR + 1},
147         {"DR2", LBREG, i386.D_DR + 2},
148         {"DR3", LBREG, i386.D_DR + 3},
149         {"DR4", LBREG, i386.D_DR + 4},
150         {"DR5", LBREG, i386.D_DR + 5},
151         {"DR6", LBREG, i386.D_DR + 6},
152         {"DR7", LBREG, i386.D_DR + 7},
153         {"TR0", LBREG, i386.D_TR + 0},
154         {"TR1", LBREG, i386.D_TR + 1},
155         {"TR2", LBREG, i386.D_TR + 2},
156         {"TR3", LBREG, i386.D_TR + 3},
157         {"TR4", LBREG, i386.D_TR + 4},
158         {"TR5", LBREG, i386.D_TR + 5},
159         {"TR6", LBREG, i386.D_TR + 6},
160         {"TR7", LBREG, i386.D_TR + 7},
161         {"AAA", LTYPE0, i386.AAAA},
162         {"AAD", LTYPE0, i386.AAAD},
163         {"AAM", LTYPE0, i386.AAAM},
164         {"AAS", LTYPE0, i386.AAAS},
165         {"ADCB", LTYPE3, i386.AADCB},
166         {"ADCL", LTYPE3, i386.AADCL},
167         {"ADCW", LTYPE3, i386.AADCW},
168         {"ADDB", LTYPE3, i386.AADDB},
169         {"ADDL", LTYPE3, i386.AADDL},
170         {"ADDW", LTYPE3, i386.AADDW},
171         {"ADJSP", LTYPE2, i386.AADJSP},
172         {"ANDB", LTYPE3, i386.AANDB},
173         {"ANDL", LTYPE3, i386.AANDL},
174         {"ANDW", LTYPE3, i386.AANDW},
175         {"ARPL", LTYPE3, i386.AARPL},
176         {"BOUNDL", LTYPE3, i386.ABOUNDL},
177         {"BOUNDW", LTYPE3, i386.ABOUNDW},
178         {"BSFL", LTYPE3, i386.ABSFL},
179         {"BSFW", LTYPE3, i386.ABSFW},
180         {"BSRL", LTYPE3, i386.ABSRL},
181         {"BSRW", LTYPE3, i386.ABSRW},
182         {"BSWAPL", LTYPE1, i386.ABSWAPL},
183         {"BTCL", LTYPE3, i386.ABTCL},
184         {"BTCW", LTYPE3, i386.ABTCW},
185         {"BTL", LTYPE3, i386.ABTL},
186         {"BTRL", LTYPE3, i386.ABTRL},
187         {"BTRW", LTYPE3, i386.ABTRW},
188         {"BTSL", LTYPE3, i386.ABTSL},
189         {"BTSW", LTYPE3, i386.ABTSW},
190         {"BTW", LTYPE3, i386.ABTW},
191         {"BYTE", LTYPE2, i386.ABYTE},
192         {"CALL", LTYPEC, i386.ACALL},
193         {"CLC", LTYPE0, i386.ACLC},
194         {"CLD", LTYPE0, i386.ACLD},
195         {"CLI", LTYPE0, i386.ACLI},
196         {"CLTS", LTYPE0, i386.ACLTS},
197         {"CMC", LTYPE0, i386.ACMC},
198         {"CMPB", LTYPE4, i386.ACMPB},
199         {"CMPL", LTYPE4, i386.ACMPL},
200         {"CMPW", LTYPE4, i386.ACMPW},
201         {"CMPSB", LTYPE0, i386.ACMPSB},
202         {"CMPSL", LTYPE0, i386.ACMPSL},
203         {"CMPSW", LTYPE0, i386.ACMPSW},
204         {"CMPXCHG8B", LTYPE1, i386.ACMPXCHG8B},
205         {"CMPXCHGB", LTYPE3, i386.ACMPXCHGB},
206         {"CMPXCHGL", LTYPE3, i386.ACMPXCHGL},
207         {"CMPXCHGW", LTYPE3, i386.ACMPXCHGW},
208         {"CPUID", LTYPE0, i386.ACPUID},
209         {"DAA", LTYPE0, i386.ADAA},
210         {"DAS", LTYPE0, i386.ADAS},
211         {"DATA", LTYPED, i386.ADATA},
212         {"DECB", LTYPE1, i386.ADECB},
213         {"DECL", LTYPE1, i386.ADECL},
214         {"DECW", LTYPE1, i386.ADECW},
215         {"DIVB", LTYPE2, i386.ADIVB},
216         {"DIVL", LTYPE2, i386.ADIVL},
217         {"DIVW", LTYPE2, i386.ADIVW},
218         {"END", LTYPE0, i386.AEND},
219         {"ENTER", LTYPE2, i386.AENTER},
220         {"GLOBL", LTYPEG, i386.AGLOBL},
221         {"HLT", LTYPE0, i386.AHLT},
222         {"IDIVB", LTYPE2, i386.AIDIVB},
223         {"IDIVL", LTYPE2, i386.AIDIVL},
224         {"IDIVW", LTYPE2, i386.AIDIVW},
225         {"IMULB", LTYPE2, i386.AIMULB},
226         {"IMULL", LTYPEI, i386.AIMULL},
227         {"IMULW", LTYPEI, i386.AIMULW},
228         {"INB", LTYPE0, i386.AINB},
229         {"INL", LTYPE0, i386.AINL},
230         {"INW", LTYPE0, i386.AINW},
231         {"INCB", LTYPE1, i386.AINCB},
232         {"INCL", LTYPE1, i386.AINCL},
233         {"INCW", LTYPE1, i386.AINCW},
234         {"INSB", LTYPE0, i386.AINSB},
235         {"INSL", LTYPE0, i386.AINSL},
236         {"INSW", LTYPE0, i386.AINSW},
237         {"INT", LTYPE2, i386.AINT},
238         {"INTO", LTYPE0, i386.AINTO},
239         {"IRETL", LTYPE0, i386.AIRETL},
240         {"IRETW", LTYPE0, i386.AIRETW},
241         {"JOS", LTYPER, i386.AJOS},  /* overflow set (OF = 1) */
242         {"JO", LTYPER, i386.AJOS},   /* alternate */
243         {"JOC", LTYPER, i386.AJOC},  /* overflow clear (OF = 0) */
244         {"JNO", LTYPER, i386.AJOC},  /* alternate */
245         {"JCS", LTYPER, i386.AJCS},  /* carry set (CF = 1) */
246         {"JB", LTYPER, i386.AJCS},   /* alternate */
247         {"JC", LTYPER, i386.AJCS},   /* alternate */
248         {"JNAE", LTYPER, i386.AJCS}, /* alternate */
249         {"JLO", LTYPER, i386.AJCS},  /* alternate */
250         {"JCC", LTYPER, i386.AJCC},  /* carry clear (CF = 0) */
251         {"JAE", LTYPER, i386.AJCC},  /* alternate */
252         {"JNB", LTYPER, i386.AJCC},  /* alternate */
253         {"JNC", LTYPER, i386.AJCC},  /* alternate */
254         {"JHS", LTYPER, i386.AJCC},  /* alternate */
255         {"JEQ", LTYPER, i386.AJEQ},  /* equal (ZF = 1) */
256         {"JE", LTYPER, i386.AJEQ},   /* alternate */
257         {"JZ", LTYPER, i386.AJEQ},   /* alternate */
258         {"JNE", LTYPER, i386.AJNE},  /* not equal (ZF = 0) */
259         {"JNZ", LTYPER, i386.AJNE},  /* alternate */
260         {"JLS", LTYPER, i386.AJLS},  /* lower or same (unsigned) (CF = 1 || ZF = 1) */
261         {"JBE", LTYPER, i386.AJLS},  /* alternate */
262         {"JNA", LTYPER, i386.AJLS},  /* alternate */
263         {"JHI", LTYPER, i386.AJHI},  /* higher (unsigned) (CF = 0 && ZF = 0) */
264         {"JA", LTYPER, i386.AJHI},   /* alternate */
265         {"JNBE", LTYPER, i386.AJHI}, /* alternate */
266         {"JMI", LTYPER, i386.AJMI},  /* negative (minus) (SF = 1) */
267         {"JS", LTYPER, i386.AJMI},   /* alternate */
268         {"JPL", LTYPER, i386.AJPL},  /* non-negative (plus) (SF = 0) */
269         {"JNS", LTYPER, i386.AJPL},  /* alternate */
270         {"JPS", LTYPER, i386.AJPS},  /* parity set (PF = 1) */
271         {"JP", LTYPER, i386.AJPS},   /* alternate */
272         {"JPE", LTYPER, i386.AJPS},  /* alternate */
273         {"JPC", LTYPER, i386.AJPC},  /* parity clear (PF = 0) */
274         {"JNP", LTYPER, i386.AJPC},  /* alternate */
275         {"JPO", LTYPER, i386.AJPC},  /* alternate */
276         {"JLT", LTYPER, i386.AJLT},  /* less than (signed) (SF != OF) */
277         {"JL", LTYPER, i386.AJLT},   /* alternate */
278         {"JNGE", LTYPER, i386.AJLT}, /* alternate */
279         {"JGE", LTYPER, i386.AJGE},  /* greater than or equal (signed) (SF = OF) */
280         {"JNL", LTYPER, i386.AJGE},  /* alternate */
281         {"JLE", LTYPER, i386.AJLE},  /* less than or equal (signed) (ZF = 1 || SF != OF) */
282         {"JNG", LTYPER, i386.AJLE},  /* alternate */
283         {"JGT", LTYPER, i386.AJGT},  /* greater than (signed) (ZF = 0 && SF = OF) */
284         {"JG", LTYPER, i386.AJGT},   /* alternate */
285         {"JNLE", LTYPER, i386.AJGT}, /* alternate */
286         {"JCXZL", LTYPER, i386.AJCXZL},
287         {"JCXZW", LTYPER, i386.AJCXZW},
288         {"JMP", LTYPEC, i386.AJMP},
289         {"LAHF", LTYPE0, i386.ALAHF},
290         {"LARL", LTYPE3, i386.ALARL},
291         {"LARW", LTYPE3, i386.ALARW},
292         {"LEAL", LTYPE3, i386.ALEAL},
293         {"LEAW", LTYPE3, i386.ALEAW},
294         {"LEAVEL", LTYPE0, i386.ALEAVEL},
295         {"LEAVEW", LTYPE0, i386.ALEAVEW},
296         {"LOCK", LTYPE0, i386.ALOCK},
297         {"LODSB", LTYPE0, i386.ALODSB},
298         {"LODSL", LTYPE0, i386.ALODSL},
299         {"LODSW", LTYPE0, i386.ALODSW},
300         {"LONG", LTYPE2, i386.ALONG},
301         {"LOOP", LTYPER, i386.ALOOP},
302         {"LOOPEQ", LTYPER, i386.ALOOPEQ},
303         {"LOOPNE", LTYPER, i386.ALOOPNE},
304         {"LSLL", LTYPE3, i386.ALSLL},
305         {"LSLW", LTYPE3, i386.ALSLW},
306         {"MOVB", LTYPE3, i386.AMOVB},
307         {"MOVL", LTYPEM, i386.AMOVL},
308         {"MOVW", LTYPEM, i386.AMOVW},
309         {"MOVQ", LTYPEM, i386.AMOVQ},
310         {"MOVBLSX", LTYPE3, i386.AMOVBLSX},
311         {"MOVBLZX", LTYPE3, i386.AMOVBLZX},
312         {"MOVBWSX", LTYPE3, i386.AMOVBWSX},
313         {"MOVBWZX", LTYPE3, i386.AMOVBWZX},
314         {"MOVWLSX", LTYPE3, i386.AMOVWLSX},
315         {"MOVWLZX", LTYPE3, i386.AMOVWLZX},
316         {"MOVSB", LTYPE0, i386.AMOVSB},
317         {"MOVSL", LTYPE0, i386.AMOVSL},
318         {"MOVSW", LTYPE0, i386.AMOVSW},
319         {"MULB", LTYPE2, i386.AMULB},
320         {"MULL", LTYPE2, i386.AMULL},
321         {"MULW", LTYPE2, i386.AMULW},
322         {"NEGB", LTYPE1, i386.ANEGB},
323         {"NEGL", LTYPE1, i386.ANEGL},
324         {"NEGW", LTYPE1, i386.ANEGW},
325         {"NOP", LTYPEN, i386.ANOP},
326         {"NOTB", LTYPE1, i386.ANOTB},
327         {"NOTL", LTYPE1, i386.ANOTL},
328         {"NOTW", LTYPE1, i386.ANOTW},
329         {"ORB", LTYPE3, i386.AORB},
330         {"ORL", LTYPE3, i386.AORL},
331         {"ORW", LTYPE3, i386.AORW},
332         {"OUTB", LTYPE0, i386.AOUTB},
333         {"OUTL", LTYPE0, i386.AOUTL},
334         {"OUTW", LTYPE0, i386.AOUTW},
335         {"OUTSB", LTYPE0, i386.AOUTSB},
336         {"OUTSL", LTYPE0, i386.AOUTSL},
337         {"OUTSW", LTYPE0, i386.AOUTSW},
338         {"PAUSE", LTYPEN, i386.APAUSE},
339         {"PINSRD", LTYPEX, i386.APINSRD},
340         {"POPAL", LTYPE0, i386.APOPAL},
341         {"POPAW", LTYPE0, i386.APOPAW},
342         {"POPFL", LTYPE0, i386.APOPFL},
343         {"POPFW", LTYPE0, i386.APOPFW},
344         {"POPL", LTYPE1, i386.APOPL},
345         {"POPW", LTYPE1, i386.APOPW},
346         {"PUSHAL", LTYPE0, i386.APUSHAL},
347         {"PUSHAW", LTYPE0, i386.APUSHAW},
348         {"PUSHFL", LTYPE0, i386.APUSHFL},
349         {"PUSHFW", LTYPE0, i386.APUSHFW},
350         {"PUSHL", LTYPE2, i386.APUSHL},
351         {"PUSHW", LTYPE2, i386.APUSHW},
352         {"RCLB", LTYPE3, i386.ARCLB},
353         {"RCLL", LTYPE3, i386.ARCLL},
354         {"RCLW", LTYPE3, i386.ARCLW},
355         {"RCRB", LTYPE3, i386.ARCRB},
356         {"RCRL", LTYPE3, i386.ARCRL},
357         {"RCRW", LTYPE3, i386.ARCRW},
358         {"RDTSC", LTYPE0, i386.ARDTSC},
359         {"REP", LTYPE0, i386.AREP},
360         {"REPN", LTYPE0, i386.AREPN},
361         {"RET", LTYPE0, i386.ARET},
362         {"ROLB", LTYPE3, i386.AROLB},
363         {"ROLL", LTYPE3, i386.AROLL},
364         {"ROLW", LTYPE3, i386.AROLW},
365         {"RORB", LTYPE3, i386.ARORB},
366         {"RORL", LTYPE3, i386.ARORL},
367         {"RORW", LTYPE3, i386.ARORW},
368         {"SAHF", LTYPE0, i386.ASAHF},
369         {"SALB", LTYPE3, i386.ASALB},
370         {"SALL", LTYPE3, i386.ASALL},
371         {"SALW", LTYPE3, i386.ASALW},
372         {"SARB", LTYPE3, i386.ASARB},
373         {"SARL", LTYPE3, i386.ASARL},
374         {"SARW", LTYPE3, i386.ASARW},
375         {"SBBB", LTYPE3, i386.ASBBB},
376         {"SBBL", LTYPE3, i386.ASBBL},
377         {"SBBW", LTYPE3, i386.ASBBW},
378         {"SCASB", LTYPE0, i386.ASCASB},
379         {"SCASL", LTYPE0, i386.ASCASL},
380         {"SCASW", LTYPE0, i386.ASCASW},
381         {"SETCC", LTYPE1, i386.ASETCC}, /* see JCC etc above for condition codes */
382         {"SETCS", LTYPE1, i386.ASETCS},
383         {"SETEQ", LTYPE1, i386.ASETEQ},
384         {"SETGE", LTYPE1, i386.ASETGE},
385         {"SETGT", LTYPE1, i386.ASETGT},
386         {"SETHI", LTYPE1, i386.ASETHI},
387         {"SETLE", LTYPE1, i386.ASETLE},
388         {"SETLS", LTYPE1, i386.ASETLS},
389         {"SETLT", LTYPE1, i386.ASETLT},
390         {"SETMI", LTYPE1, i386.ASETMI},
391         {"SETNE", LTYPE1, i386.ASETNE},
392         {"SETOC", LTYPE1, i386.ASETOC},
393         {"SETOS", LTYPE1, i386.ASETOS},
394         {"SETPC", LTYPE1, i386.ASETPC},
395         {"SETPL", LTYPE1, i386.ASETPL},
396         {"SETPS", LTYPE1, i386.ASETPS},
397         {"CDQ", LTYPE0, i386.ACDQ},
398         {"CWD", LTYPE0, i386.ACWD},
399         {"SHLB", LTYPE3, i386.ASHLB},
400         {"SHLL", LTYPES, i386.ASHLL},
401         {"SHLW", LTYPES, i386.ASHLW},
402         {"SHRB", LTYPE3, i386.ASHRB},
403         {"SHRL", LTYPES, i386.ASHRL},
404         {"SHRW", LTYPES, i386.ASHRW},
405         {"STC", LTYPE0, i386.ASTC},
406         {"STD", LTYPE0, i386.ASTD},
407         {"STI", LTYPE0, i386.ASTI},
408         {"STOSB", LTYPE0, i386.ASTOSB},
409         {"STOSL", LTYPE0, i386.ASTOSL},
410         {"STOSW", LTYPE0, i386.ASTOSW},
411         {"SUBB", LTYPE3, i386.ASUBB},
412         {"SUBL", LTYPE3, i386.ASUBL},
413         {"SUBW", LTYPE3, i386.ASUBW},
414         {"SYSCALL", LTYPE0, i386.ASYSCALL},
415         {"TESTB", LTYPE3, i386.ATESTB},
416         {"TESTL", LTYPE3, i386.ATESTL},
417         {"TESTW", LTYPE3, i386.ATESTW},
418         {"TEXT", LTYPET, i386.ATEXT},
419         {"VERR", LTYPE2, i386.AVERR},
420         {"VERW", LTYPE2, i386.AVERW},
421         {"WAIT", LTYPE0, i386.AWAIT},
422         {"WORD", LTYPE2, i386.AWORD},
423         {"XADDB", LTYPE3, i386.AXADDB},
424         {"XADDL", LTYPE3, i386.AXADDL},
425         {"XADDW", LTYPE3, i386.AXADDW},
426         {"XCHGB", LTYPE3, i386.AXCHGB},
427         {"XCHGL", LTYPE3, i386.AXCHGL},
428         {"XCHGW", LTYPE3, i386.AXCHGW},
429         {"XLAT", LTYPE2, i386.AXLAT},
430         {"XORB", LTYPE3, i386.AXORB},
431         {"XORL", LTYPE3, i386.AXORL},
432         {"XORW", LTYPE3, i386.AXORW},
433         {"CMOVLCC", LTYPE3, i386.ACMOVLCC},
434         {"CMOVLCS", LTYPE3, i386.ACMOVLCS},
435         {"CMOVLEQ", LTYPE3, i386.ACMOVLEQ},
436         {"CMOVLGE", LTYPE3, i386.ACMOVLGE},
437         {"CMOVLGT", LTYPE3, i386.ACMOVLGT},
438         {"CMOVLHI", LTYPE3, i386.ACMOVLHI},
439         {"CMOVLLE", LTYPE3, i386.ACMOVLLE},
440         {"CMOVLLS", LTYPE3, i386.ACMOVLLS},
441         {"CMOVLLT", LTYPE3, i386.ACMOVLLT},
442         {"CMOVLMI", LTYPE3, i386.ACMOVLMI},
443         {"CMOVLNE", LTYPE3, i386.ACMOVLNE},
444         {"CMOVLOC", LTYPE3, i386.ACMOVLOC},
445         {"CMOVLOS", LTYPE3, i386.ACMOVLOS},
446         {"CMOVLPC", LTYPE3, i386.ACMOVLPC},
447         {"CMOVLPL", LTYPE3, i386.ACMOVLPL},
448         {"CMOVLPS", LTYPE3, i386.ACMOVLPS},
449         {"CMOVWCC", LTYPE3, i386.ACMOVWCC},
450         {"CMOVWCS", LTYPE3, i386.ACMOVWCS},
451         {"CMOVWEQ", LTYPE3, i386.ACMOVWEQ},
452         {"CMOVWGE", LTYPE3, i386.ACMOVWGE},
453         {"CMOVWGT", LTYPE3, i386.ACMOVWGT},
454         {"CMOVWHI", LTYPE3, i386.ACMOVWHI},
455         {"CMOVWLE", LTYPE3, i386.ACMOVWLE},
456         {"CMOVWLS", LTYPE3, i386.ACMOVWLS},
457         {"CMOVWLT", LTYPE3, i386.ACMOVWLT},
458         {"CMOVWMI", LTYPE3, i386.ACMOVWMI},
459         {"CMOVWNE", LTYPE3, i386.ACMOVWNE},
460         {"CMOVWOC", LTYPE3, i386.ACMOVWOC},
461         {"CMOVWOS", LTYPE3, i386.ACMOVWOS},
462         {"CMOVWPC", LTYPE3, i386.ACMOVWPC},
463         {"CMOVWPL", LTYPE3, i386.ACMOVWPL},
464         {"CMOVWPS", LTYPE3, i386.ACMOVWPS},
465         {"FMOVB", LTYPE3, i386.AFMOVB},
466         {"FMOVBP", LTYPE3, i386.AFMOVBP},
467         {"FMOVD", LTYPE3, i386.AFMOVD},
468         {"FMOVDP", LTYPE3, i386.AFMOVDP},
469         {"FMOVF", LTYPE3, i386.AFMOVF},
470         {"FMOVFP", LTYPE3, i386.AFMOVFP},
471         {"FMOVL", LTYPE3, i386.AFMOVL},
472         {"FMOVLP", LTYPE3, i386.AFMOVLP},
473         {"FMOVV", LTYPE3, i386.AFMOVV},
474         {"FMOVVP", LTYPE3, i386.AFMOVVP},
475         {"FMOVW", LTYPE3, i386.AFMOVW},
476         {"FMOVWP", LTYPE3, i386.AFMOVWP},
477         {"FMOVX", LTYPE3, i386.AFMOVX},
478         {"FMOVXP", LTYPE3, i386.AFMOVXP},
479         {"FCMOVCC", LTYPE3, i386.AFCMOVCC},
480         {"FCMOVCS", LTYPE3, i386.AFCMOVCS},
481         {"FCMOVEQ", LTYPE3, i386.AFCMOVEQ},
482         {"FCMOVHI", LTYPE3, i386.AFCMOVHI},
483         {"FCMOVLS", LTYPE3, i386.AFCMOVLS},
484         {"FCMOVNE", LTYPE3, i386.AFCMOVNE},
485         {"FCMOVNU", LTYPE3, i386.AFCMOVNU},
486         {"FCMOVUN", LTYPE3, i386.AFCMOVUN},
487         {"FCOMB", LTYPE3, i386.AFCOMB},
488         {"FCOMBP", LTYPE3, i386.AFCOMBP},
489         {"FCOMD", LTYPE3, i386.AFCOMD},
490         {"FCOMDP", LTYPE3, i386.AFCOMDP},
491         {"FCOMDPP", LTYPE3, i386.AFCOMDPP},
492         {"FCOMF", LTYPE3, i386.AFCOMF},
493         {"FCOMFP", LTYPE3, i386.AFCOMFP},
494         {"FCOMI", LTYPE3, i386.AFCOMI},
495         {"FCOMIP", LTYPE3, i386.AFCOMIP},
496         {"FCOML", LTYPE3, i386.AFCOML},
497         {"FCOMLP", LTYPE3, i386.AFCOMLP},
498         {"FCOMW", LTYPE3, i386.AFCOMW},
499         {"FCOMWP", LTYPE3, i386.AFCOMWP},
500         {"FUCOM", LTYPE3, i386.AFUCOM},
501         {"FUCOMI", LTYPE3, i386.AFUCOMI},
502         {"FUCOMIP", LTYPE3, i386.AFUCOMIP},
503         {"FUCOMP", LTYPE3, i386.AFUCOMP},
504         {"FUCOMPP", LTYPE3, i386.AFUCOMPP},
505         {"FADDW", LTYPE3, i386.AFADDW},
506         {"FADDL", LTYPE3, i386.AFADDL},
507         {"FADDF", LTYPE3, i386.AFADDF},
508         {"FADDD", LTYPE3, i386.AFADDD},
509         {"FADDDP", LTYPE3, i386.AFADDDP},
510         {"FSUBDP", LTYPE3, i386.AFSUBDP},
511         {"FSUBW", LTYPE3, i386.AFSUBW},
512         {"FSUBL", LTYPE3, i386.AFSUBL},
513         {"FSUBF", LTYPE3, i386.AFSUBF},
514         {"FSUBD", LTYPE3, i386.AFSUBD},
515         {"FSUBRDP", LTYPE3, i386.AFSUBRDP},
516         {"FSUBRW", LTYPE3, i386.AFSUBRW},
517         {"FSUBRL", LTYPE3, i386.AFSUBRL},
518         {"FSUBRF", LTYPE3, i386.AFSUBRF},
519         {"FSUBRD", LTYPE3, i386.AFSUBRD},
520         {"FMULDP", LTYPE3, i386.AFMULDP},
521         {"FMULW", LTYPE3, i386.AFMULW},
522         {"FMULL", LTYPE3, i386.AFMULL},
523         {"FMULF", LTYPE3, i386.AFMULF},
524         {"FMULD", LTYPE3, i386.AFMULD},
525         {"FDIVDP", LTYPE3, i386.AFDIVDP},
526         {"FDIVW", LTYPE3, i386.AFDIVW},
527         {"FDIVL", LTYPE3, i386.AFDIVL},
528         {"FDIVF", LTYPE3, i386.AFDIVF},
529         {"FDIVD", LTYPE3, i386.AFDIVD},
530         {"FDIVRDP", LTYPE3, i386.AFDIVRDP},
531         {"FDIVRW", LTYPE3, i386.AFDIVRW},
532         {"FDIVRL", LTYPE3, i386.AFDIVRL},
533         {"FDIVRF", LTYPE3, i386.AFDIVRF},
534         {"FDIVRD", LTYPE3, i386.AFDIVRD},
535         {"FXCHD", LTYPE3, i386.AFXCHD},
536         {"FFREE", LTYPE1, i386.AFFREE},
537         {"FLDCW", LTYPE2, i386.AFLDCW},
538         {"FLDENV", LTYPE1, i386.AFLDENV},
539         {"FRSTOR", LTYPE2, i386.AFRSTOR},
540         {"FSAVE", LTYPE1, i386.AFSAVE},
541         {"FSTCW", LTYPE1, i386.AFSTCW},
542         {"FSTENV", LTYPE1, i386.AFSTENV},
543         {"FSTSW", LTYPE1, i386.AFSTSW},
544         {"F2XM1", LTYPE0, i386.AF2XM1},
545         {"FABS", LTYPE0, i386.AFABS},
546         {"FCHS", LTYPE0, i386.AFCHS},
547         {"FCLEX", LTYPE0, i386.AFCLEX},
548         {"FCOS", LTYPE0, i386.AFCOS},
549         {"FDECSTP", LTYPE0, i386.AFDECSTP},
550         {"FINCSTP", LTYPE0, i386.AFINCSTP},
551         {"FINIT", LTYPE0, i386.AFINIT},
552         {"FLD1", LTYPE0, i386.AFLD1},
553         {"FLDL2E", LTYPE0, i386.AFLDL2E},
554         {"FLDL2T", LTYPE0, i386.AFLDL2T},
555         {"FLDLG2", LTYPE0, i386.AFLDLG2},
556         {"FLDLN2", LTYPE0, i386.AFLDLN2},
557         {"FLDPI", LTYPE0, i386.AFLDPI},
558         {"FLDZ", LTYPE0, i386.AFLDZ},
559         {"FNOP", LTYPE0, i386.AFNOP},
560         {"FPATAN", LTYPE0, i386.AFPATAN},
561         {"FPREM", LTYPE0, i386.AFPREM},
562         {"FPREM1", LTYPE0, i386.AFPREM1},
563         {"FPTAN", LTYPE0, i386.AFPTAN},
564         {"FRNDINT", LTYPE0, i386.AFRNDINT},
565         {"FSCALE", LTYPE0, i386.AFSCALE},
566         {"FSIN", LTYPE0, i386.AFSIN},
567         {"FSINCOS", LTYPE0, i386.AFSINCOS},
568         {"FSQRT", LTYPE0, i386.AFSQRT},
569         {"FTST", LTYPE0, i386.AFTST},
570         {"FXAM", LTYPE0, i386.AFXAM},
571         {"FXTRACT", LTYPE0, i386.AFXTRACT},
572         {"FYL2X", LTYPE0, i386.AFYL2X},
573         {"FYL2XP1", LTYPE0, i386.AFYL2XP1},
574         {"LFENCE", LTYPE0, i386.ALFENCE},
575         {"MFENCE", LTYPE0, i386.AMFENCE},
576         {"SFENCE", LTYPE0, i386.ASFENCE},
577         {"EMMS", LTYPE0, i386.AEMMS},
578         {"PREFETCHT0", LTYPE2, i386.APREFETCHT0},
579         {"PREFETCHT1", LTYPE2, i386.APREFETCHT1},
580         {"PREFETCHT2", LTYPE2, i386.APREFETCHT2},
581         {"PREFETCHNTA", LTYPE2, i386.APREFETCHNTA},
582         {"UNDEF", LTYPE0, i386.AUNDEF},
583         {"ADDPD", LTYPE3, i386.AADDPD},
584         {"ADDPS", LTYPE3, i386.AADDPS},
585         {"ADDSD", LTYPE3, i386.AADDSD},
586         {"ADDSS", LTYPE3, i386.AADDSS},
587         {"AESENC", LTYPE3, i386.AAESENC},
588         {"ANDNPD", LTYPE3, i386.AANDNPD},
589         {"ANDNPS", LTYPE3, i386.AANDNPS},
590         {"ANDPD", LTYPE3, i386.AANDPD},
591         {"ANDPS", LTYPE3, i386.AANDPS},
592         {"CMPPD", LTYPEXC, i386.ACMPPD},
593         {"CMPPS", LTYPEXC, i386.ACMPPS},
594         {"CMPSD", LTYPEXC, i386.ACMPSD},
595         {"CMPSS", LTYPEXC, i386.ACMPSS},
596         {"COMISD", LTYPE3, i386.ACOMISD},
597         {"COMISS", LTYPE3, i386.ACOMISS},
598         {"CVTPL2PD", LTYPE3, i386.ACVTPL2PD},
599         {"CVTPL2PS", LTYPE3, i386.ACVTPL2PS},
600         {"CVTPD2PL", LTYPE3, i386.ACVTPD2PL},
601         {"CVTPD2PS", LTYPE3, i386.ACVTPD2PS},
602         {"CVTPS2PL", LTYPE3, i386.ACVTPS2PL},
603         {"CVTPS2PD", LTYPE3, i386.ACVTPS2PD},
604         {"CVTSD2SL", LTYPE3, i386.ACVTSD2SL},
605         {"CVTSD2SS", LTYPE3, i386.ACVTSD2SS},
606         {"CVTSL2SD", LTYPE3, i386.ACVTSL2SD},
607         {"CVTSL2SS", LTYPE3, i386.ACVTSL2SS},
608         {"CVTSS2SD", LTYPE3, i386.ACVTSS2SD},
609         {"CVTSS2SL", LTYPE3, i386.ACVTSS2SL},
610         {"CVTTPD2PL", LTYPE3, i386.ACVTTPD2PL},
611         {"CVTTPS2PL", LTYPE3, i386.ACVTTPS2PL},
612         {"CVTTSD2SL", LTYPE3, i386.ACVTTSD2SL},
613         {"CVTTSS2SL", LTYPE3, i386.ACVTTSS2SL},
614         {"DIVPD", LTYPE3, i386.ADIVPD},
615         {"DIVPS", LTYPE3, i386.ADIVPS},
616         {"DIVSD", LTYPE3, i386.ADIVSD},
617         {"DIVSS", LTYPE3, i386.ADIVSS},
618         {"MASKMOVOU", LTYPE3, i386.AMASKMOVOU},
619         {"MASKMOVDQU", LTYPE3, i386.AMASKMOVOU}, /* syn */
620         {"MAXPD", LTYPE3, i386.AMAXPD},
621         {"MAXPS", LTYPE3, i386.AMAXPS},
622         {"MAXSD", LTYPE3, i386.AMAXSD},
623         {"MAXSS", LTYPE3, i386.AMAXSS},
624         {"MINPD", LTYPE3, i386.AMINPD},
625         {"MINPS", LTYPE3, i386.AMINPS},
626         {"MINSD", LTYPE3, i386.AMINSD},
627         {"MINSS", LTYPE3, i386.AMINSS},
628         {"MOVAPD", LTYPE3, i386.AMOVAPD},
629         {"MOVAPS", LTYPE3, i386.AMOVAPS},
630         {"MOVO", LTYPE3, i386.AMOVO},
631         {"MOVOA", LTYPE3, i386.AMOVO}, /* syn */
632         {"MOVOU", LTYPE3, i386.AMOVOU},
633         {"MOVHLPS", LTYPE3, i386.AMOVHLPS},
634         {"MOVHPD", LTYPE3, i386.AMOVHPD},
635         {"MOVHPS", LTYPE3, i386.AMOVHPS},
636         {"MOVLHPS", LTYPE3, i386.AMOVLHPS},
637         {"MOVLPD", LTYPE3, i386.AMOVLPD},
638         {"MOVLPS", LTYPE3, i386.AMOVLPS},
639         {"MOVMSKPD", LTYPE3, i386.AMOVMSKPD},
640         {"MOVMSKPS", LTYPE3, i386.AMOVMSKPS},
641         {"MOVNTO", LTYPE3, i386.AMOVNTO},
642         {"MOVNTDQ", LTYPE3, i386.AMOVNTO}, /* syn */
643         {"MOVNTPD", LTYPE3, i386.AMOVNTPD},
644         {"MOVNTPS", LTYPE3, i386.AMOVNTPS},
645         {"MOVSD", LTYPE3, i386.AMOVSD},
646         {"MOVSS", LTYPE3, i386.AMOVSS},
647         {"MOVUPD", LTYPE3, i386.AMOVUPD},
648         {"MOVUPS", LTYPE3, i386.AMOVUPS},
649         {"MULPD", LTYPE3, i386.AMULPD},
650         {"MULPS", LTYPE3, i386.AMULPS},
651         {"MULSD", LTYPE3, i386.AMULSD},
652         {"MULSS", LTYPE3, i386.AMULSS},
653         {"ORPD", LTYPE3, i386.AORPD},
654         {"ORPS", LTYPE3, i386.AORPS},
655         {"PADDQ", LTYPE3, i386.APADDQ},
656         {"PAND", LTYPE3, i386.APAND},
657         {"PCMPEQB", LTYPE3, i386.APCMPEQB},
658         {"PMAXSW", LTYPE3, i386.APMAXSW},
659         {"PMAXUB", LTYPE3, i386.APMAXUB},
660         {"PMINSW", LTYPE3, i386.APMINSW},
661         {"PMINUB", LTYPE3, i386.APMINUB},
662         {"PMOVMSKB", LTYPE3, i386.APMOVMSKB},
663         {"PSADBW", LTYPE3, i386.APSADBW},
664         {"PSHUFB", LTYPE3, i386.APSHUFB},
665         {"PSHUFHW", LTYPEX, i386.APSHUFHW},
666         {"PSHUFL", LTYPEX, i386.APSHUFL},
667         {"PSHUFLW", LTYPEX, i386.APSHUFLW},
668         {"PSUBB", LTYPE3, i386.APSUBB},
669         {"PSUBL", LTYPE3, i386.APSUBL},
670         {"PSUBQ", LTYPE3, i386.APSUBQ},
671         {"PSUBSB", LTYPE3, i386.APSUBSB},
672         {"PSUBSW", LTYPE3, i386.APSUBSW},
673         {"PSUBUSB", LTYPE3, i386.APSUBUSB},
674         {"PSUBUSW", LTYPE3, i386.APSUBUSW},
675         {"PSUBW", LTYPE3, i386.APSUBW},
676         {"PUNPCKHQDQ", LTYPE3, i386.APUNPCKHQDQ},
677         {"PUNPCKLQDQ", LTYPE3, i386.APUNPCKLQDQ},
678         {"PXOR", LTYPE3, i386.APXOR},
679         {"RCPPS", LTYPE3, i386.ARCPPS},
680         {"RCPSS", LTYPE3, i386.ARCPSS},
681         {"RSQRTPS", LTYPE3, i386.ARSQRTPS},
682         {"RSQRTSS", LTYPE3, i386.ARSQRTSS},
683         {"SQRTPD", LTYPE3, i386.ASQRTPD},
684         {"SQRTPS", LTYPE3, i386.ASQRTPS},
685         {"SQRTSD", LTYPE3, i386.ASQRTSD},
686         {"SQRTSS", LTYPE3, i386.ASQRTSS},
687         {"SUBPD", LTYPE3, i386.ASUBPD},
688         {"SUBPS", LTYPE3, i386.ASUBPS},
689         {"SUBSD", LTYPE3, i386.ASUBSD},
690         {"SUBSS", LTYPE3, i386.ASUBSS},
691         {"UCOMISD", LTYPE3, i386.AUCOMISD},
692         {"UCOMISS", LTYPE3, i386.AUCOMISS},
693         {"UNPCKHPD", LTYPE3, i386.AUNPCKHPD},
694         {"UNPCKHPS", LTYPE3, i386.AUNPCKHPS},
695         {"UNPCKLPD", LTYPE3, i386.AUNPCKLPD},
696         {"UNPCKLPS", LTYPE3, i386.AUNPCKLPS},
697         {"XORPD", LTYPE3, i386.AXORPD},
698         {"XORPS", LTYPE3, i386.AXORPS},
699         {"USEFIELD", LTYPEN, i386.AUSEFIELD},
700         {"PCDATA", LTYPEPC, i386.APCDATA},
701         {"FUNCDATA", LTYPEF, i386.AFUNCDATA},
702 }
703
704 func cinit() {
705         nullgen.Type_ = i386.D_NONE
706         nullgen.Index = i386.D_NONE
707 }
708
709 func checkscale(scale int8) {
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(i386.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 != i386.AGLOBL && a != i386.ADATA {
769                 asm.PC++
770         }
771 }