Mercurial > projects > ldc
annotate gen/d-asm-i386.h @ 304:3ebc136702dd trunk
[svn r325] Removed dead code.
Added license info to code from GDC (David Friedman permitted us to use the files under the Artistic License).
Added asmLabel check to DtoGoto to avoid jumping into inline asm. Doesn't work currently as LabelDsymbol::asmLabel is never set to true.
author | ChristianK |
---|---|
date | Wed, 25 Jun 2008 23:42:38 +0200 |
parents | bef811104734 |
children | 2b72433d5c8c |
rev | line source |
---|---|
304 | 1 // Taken from GDC source tree. Original by David Friedman. |
2 // Released under the Artistic License found in dmd/artistic.txt | |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
3 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
4 #include "dmd/id.h" |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
5 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
6 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
7 Reg_Invalid = -1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
8 Reg_EAX = 0, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
9 Reg_EBX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
10 Reg_ECX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
11 Reg_EDX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
12 Reg_ESI, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
13 Reg_EDI, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
14 Reg_EBP, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
15 Reg_ESP, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
16 Reg_ST, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
17 Reg_ST1, Reg_ST2, Reg_ST3, Reg_ST4, Reg_ST5, Reg_ST6, Reg_ST7, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
18 Reg_MM0, Reg_MM1, Reg_MM2, Reg_MM3, Reg_MM4, Reg_MM5, Reg_MM6, Reg_MM7, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
19 Reg_XMM0, Reg_XMM1, Reg_XMM2, Reg_XMM3, Reg_XMM4, Reg_XMM5, Reg_XMM6, Reg_XMM7, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
20 // will need 64-bit rax,etc. eventually |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
21 // xmm8-15? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
22 Reg_EFLAGS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
23 Reg_CS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
24 Reg_DS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
25 Reg_SS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
26 Reg_ES, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
27 Reg_FS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
28 Reg_GS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
29 Reg_AX, Reg_BX, Reg_CX, Reg_DX, Reg_SI, Reg_DI, Reg_BP, Reg_SP, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
30 Reg_AL, Reg_AH, Reg_BL, Reg_BH, Reg_CL, Reg_CH, Reg_DL, Reg_DH, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
31 Reg_CR0, Reg_CR2, Reg_CR3, Reg_CR4, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
32 Reg_DR0, Reg_DR1, Reg_DR2, Reg_DR3, Reg_DR6, Reg_DR7, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
33 Reg_TR3, Reg_TR4, Reg_TR5, Reg_TR6, Reg_TR7 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
34 } Reg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
35 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
36 static const int N_Regs = /*gp*/ 8 + /*fp*/ 8 + /*mmx*/ 8 + /*sse*/ 8 + |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
37 /*seg*/ 6 + /*16bit*/ 8 + /*8bit*/ 8 + /*sys*/ 4+6+5 + /*flags*/ + 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
38 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
39 #define NULL_TREE "" |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
40 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
41 static struct { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
42 const char * name; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
43 std::string gccName; // GAS will take upper case, but GCC won't (needed for the clobber list) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
44 Identifier * ident; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
45 char size; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
46 char baseReg; // %% todo: Reg, Reg_XX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
47 } regInfo[N_Regs] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
48 { "EAX", NULL_TREE, NULL, 4, Reg_EAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
49 { "EBX", NULL_TREE, NULL, 4, Reg_EBX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
50 { "ECX", NULL_TREE, NULL, 4, Reg_ECX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
51 { "EDX", NULL_TREE, NULL, 4, Reg_EDX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
52 { "ESI", NULL_TREE, NULL, 4, Reg_ESI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
53 { "EDI", NULL_TREE, NULL, 4, Reg_EDI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
54 { "EBP", NULL_TREE, NULL, 4, Reg_EBP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
55 { "ESP", NULL_TREE, NULL, 4, Reg_ESP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
56 { "ST", NULL_TREE, NULL, 10, Reg_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
57 { "ST(1)", NULL_TREE, NULL,10, Reg_ST1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
58 { "ST(2)", NULL_TREE, NULL,10, Reg_ST2 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
59 { "ST(3)", NULL_TREE, NULL,10, Reg_ST3 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
60 { "ST(4)", NULL_TREE, NULL,10, Reg_ST4 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
61 { "ST(5)", NULL_TREE, NULL,10, Reg_ST5 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
62 { "ST(6)", NULL_TREE, NULL,10, Reg_ST6 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
63 { "ST(7)", NULL_TREE, NULL,10, Reg_ST7 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
64 { "MM0", NULL_TREE, NULL, 8, Reg_MM0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
65 { "MM1", NULL_TREE, NULL, 8, Reg_MM1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
66 { "MM2", NULL_TREE, NULL, 8, Reg_MM2 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
67 { "MM3", NULL_TREE, NULL, 8, Reg_MM3 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
68 { "MM4", NULL_TREE, NULL, 8, Reg_MM4 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
69 { "MM5", NULL_TREE, NULL, 8, Reg_MM5 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
70 { "MM6", NULL_TREE, NULL, 8, Reg_MM6 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
71 { "MM7", NULL_TREE, NULL, 8, Reg_MM7 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
72 { "XMM0", NULL_TREE, NULL, 16, Reg_XMM0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
73 { "XMM1", NULL_TREE, NULL, 16, Reg_XMM1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
74 { "XMM2", NULL_TREE, NULL, 16, Reg_XMM2 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
75 { "XMM3", NULL_TREE, NULL, 16, Reg_XMM3 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
76 { "XMM4", NULL_TREE, NULL, 16, Reg_XMM4 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
77 { "XMM5", NULL_TREE, NULL, 16, Reg_XMM5 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
78 { "XMM6", NULL_TREE, NULL, 16, Reg_XMM6 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
79 { "XMM7", NULL_TREE, NULL, 16, Reg_XMM7 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
80 { "FLAGS", NULL_TREE, NULL, 0, Reg_EFLAGS }, // the gcc name is "flags"; not used in assembler input |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
81 { "CS", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
82 { "DS", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
83 { "SS", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
84 { "ES", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
85 { "FS", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
86 { "GS", NULL_TREE, NULL, 2, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
87 { "AX", NULL_TREE, NULL, 2, Reg_EAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
88 { "BX", NULL_TREE, NULL, 2, Reg_EBX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
89 { "CX", NULL_TREE, NULL, 2, Reg_ECX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
90 { "DX", NULL_TREE, NULL, 2, Reg_EDX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
91 { "SI", NULL_TREE, NULL, 2, Reg_ESI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
92 { "DI", NULL_TREE, NULL, 2, Reg_EDI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
93 { "BP", NULL_TREE, NULL, 2, Reg_EBP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
94 { "SP", NULL_TREE, NULL, 2, Reg_ESP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
95 { "AL", NULL_TREE, NULL, 1, Reg_EAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
96 { "AH", NULL_TREE, NULL, 1, Reg_EAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
97 { "BL", NULL_TREE, NULL, 1, Reg_EBX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
98 { "BH", NULL_TREE, NULL, 1, Reg_EBX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
99 { "CL", NULL_TREE, NULL, 1, Reg_ECX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
100 { "CH", NULL_TREE, NULL, 1, Reg_ECX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
101 { "DL", NULL_TREE, NULL, 1, Reg_EDX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
102 { "DH", NULL_TREE, NULL, 1, Reg_EDX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
103 { "CR0", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
104 { "CR2", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
105 { "CR3", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
106 { "CR4", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
107 { "DR0", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
108 { "DR1", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
109 { "DR2", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
110 { "DR3", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
111 { "DR6", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
112 { "DR7", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
113 { "TR3", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
114 { "TR4", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
115 { "TR5", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
116 { "TR6", NULL_TREE, NULL, 0, -1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
117 { "TR7", NULL_TREE, NULL, 0, -1 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
118 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
119 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
120 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
121 No_Type_Needed, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
122 Int_Types, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
123 Word_Types, // same as Int_Types, but byte is not allowed |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
124 FP_Types, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
125 FPInt_Types, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
126 Byte_NoType, // byte only, but no type suffix |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
127 } TypeNeeded; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
128 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
129 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
130 No_Link, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
131 Out_Mnemonic, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
132 Next_Form |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
133 } OpLink; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
134 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
135 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
136 Clb_SizeAX = 0x01, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
137 Clb_SizeDXAX = 0x02, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
138 Clb_EAX = 0x03, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
139 Clb_DXAX_Mask = 0x03, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
140 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
141 Clb_Flags = 0x04, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
142 Clb_DI = 0x08, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
143 Clb_SI = 0x10, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
144 Clb_CX = 0x20, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
145 Clb_ST = 0x40, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
146 Clb_SP = 0x80 // Doesn't actually let GCC know the frame pointer is modified |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
147 } ImplicitClober; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
148 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
149 // "^ +/..\([A-Za-z_0-9]+\).*" -> " \1," |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
150 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
151 Op_Invalid, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
152 Op_Adjust, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
153 Op_Dst, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
154 Op_Upd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
155 Op_DstW, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
156 Op_DstF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
157 Op_UpdF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
158 Op_DstSrc, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
159 Op_DstSrcF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
160 Op_UpdSrcF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
161 Op_DstSrcFW, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
162 Op_UpdSrcFW, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
163 Op_DstSrcSSE, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
164 Op_DstSrcMMX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
165 Op_DstSrcImmS, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
166 Op_DstSrcImmM, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
167 Op_UpdSrcShft, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
168 Op_DstSrcNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
169 Op_UpdSrcNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
170 Op_DstMemNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
171 Op_DstRMBNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
172 Op_DstRMWNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
173 Op_UpdUpd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
174 Op_UpdUpdF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
175 Op_Src, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
176 Op_SrcRMWNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
177 Op_SrcW, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
178 Op_SrcImm, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
179 Op_Src_DXAXF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
180 Op_SrcMemNT, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
181 Op_SrcMemNTF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
182 Op_SrcSrc, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
183 Op_SrcSrcF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
184 Op_SrcSrcFW, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
185 Op_SrcSrcSSEF, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
186 Op_SrcSrcMMX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
187 Op_Shift, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
188 Op_Branch, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
189 Op_CBranch, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
190 Op_0, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
191 Op_0_AX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
192 Op_0_DXAX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
193 Op_Loop, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
194 Op_Flags, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
195 Op_F0_ST, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
196 Op_F0_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
197 Op_Fs_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
198 Op_Fis, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
199 Op_Fis_ST, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
200 Op_Fis_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
201 Op_Fid, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
202 Op_Fid_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
203 Op_Ffd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
204 Op_FfdR, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
205 Op_Ffd_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
206 Op_FfdR_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
207 Op_Fd_P, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
208 Op_FdST, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
209 Op_FMath, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
210 Op_FdSTiSTi, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
211 Op_FPMath, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
212 Op_FCmp, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
213 Op_FCmp1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
214 Op_FCmpP, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
215 Op_FCmpP1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
216 Op_FCmpFlg, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
217 Op_FCmpFlgP, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
218 Op_fld, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
219 Op_fldR, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
220 Op_fxch, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
221 Op_fxch1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
222 Op_fxch0, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
223 Op_SizedStack, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
224 Op_bound, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
225 Op_bswap, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
226 Op_cmps, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
227 Op_cmpsd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
228 Op_cmpsX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
229 Op_cmpxchg8b, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
230 Op_cmpxchg, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
231 Op_cpuid, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
232 Op_enter, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
233 Op_fdisi, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
234 Op_feni, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
235 Op_fsetpm, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
236 Op_fXstsw, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
237 Op_imul, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
238 Op_imul2, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
239 Op_imul1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
240 Op_in, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
241 Op_ins, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
242 Op_insX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
243 Op_iret, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
244 Op_iretd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
245 Op_lods, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
246 Op_lodsX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
247 Op_movs, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
248 Op_movsd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
249 Op_movsX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
250 Op_movsx, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
251 Op_movzx, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
252 Op_mul, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
253 Op_out, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
254 Op_outs, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
255 Op_outsX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
256 Op_push, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
257 Op_ret, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
258 Op_retf, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
259 Op_scas, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
260 Op_scasX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
261 Op_stos, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
262 Op_stosX, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
263 Op_xlat, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
264 N_AsmOpInfo, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
265 Op_Align, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
266 Op_Even, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
267 Op_Naked, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
268 Op_db, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
269 Op_ds, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
270 Op_di, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
271 Op_dl, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
272 Op_df, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
273 Op_dd, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
274 Op_de |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
275 } AsmOp; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
276 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
277 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
278 Opr_None = 0, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
279 OprC_MRI = 1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
280 OprC_MR = 2, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
281 OprC_Mem = 3, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
282 OprC_Reg = 4, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
283 OprC_Imm = 5, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
284 OprC_SSE = 6, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
285 OprC_SSE_Mem = 7, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
286 OprC_R32 = 8, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
287 OprC_RWord = 9, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
288 OprC_RFP = 10, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
289 OprC_AbsRel = 11, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
290 OprC_Relative = 12, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
291 OprC_Port = 13, // DX or imm |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
292 OprC_AX = 14, // AL,AX,EAX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
293 OprC_DX = 15, // only DX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
294 OprC_MMX = 16, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
295 OprC_MMX_Mem = 17, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
296 OprC_Shift = 18, // imm or CL |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
297 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
298 Opr_ClassMask = 0x1f, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
299 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
300 Opr_Dest = 0x20, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
301 Opr_Update = 0x60, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
302 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
303 Opr_NoType = 0x80, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
304 } OprVals; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
305 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
306 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
307 typedef struct { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
308 } AsmOprInfo; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
309 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
310 typedef unsigned char Opr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
311 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
312 typedef struct { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
313 Opr operands[3]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
314 unsigned char |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
315 needsType : 3, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
316 implicitClobbers : 8, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
317 linkType : 2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
318 unsigned link; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
319 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
320 /* |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
321 bool takesLabel() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
322 return operands[0] & Opr_Label; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
323 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
324 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
325 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
326 unsigned nOperands() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
327 if (!operands[0]) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
328 return 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
329 else if (!operands[1]) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
330 return 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
331 else if (!operands[2]) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
332 return 2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
333 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
334 return 3; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
335 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
336 } AsmOpInfo; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
337 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
338 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
339 Mn_fdisi, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
340 Mn_feni, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
341 Mn_fsetpm, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
342 Mn_iretw, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
343 Mn_iret, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
344 Mn_lret, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
345 Mn_cmpxchg8b, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
346 N_AltMn |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
347 } Alternate_Mnemonics; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
348 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
349 static const char * alternateMnemonics[N_AltMn] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
350 ".byte 0xdb, 0xe1", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
351 ".byte 0xdb, 0xe0", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
352 ".byte 0xdb, 0xe4", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
353 "iretw", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
354 "iret", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
355 "lret", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
356 "cmpxchg8b" }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
357 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
358 #define mri OprC_MRI |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
359 #define mr OprC_MR |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
360 #define mem OprC_Mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
361 // for now mfp=mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
362 #define mfp OprC_Mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
363 #define reg OprC_Reg |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
364 #define imm OprC_Imm |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
365 #define sse OprC_SSE |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
366 #define ssem OprC_SSE_Mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
367 #define mmx OprC_MMX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
368 #define mmxm OprC_MMX_Mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
369 #define r32 OprC_R32 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
370 #define rw OprC_RWord |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
371 #define rfp OprC_RFP |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
372 #define port OprC_Port |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
373 #define ax OprC_AX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
374 #define dx OprC_DX |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
375 #define shft OprC_Shift |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
376 #define D Opr_Dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
377 #define U Opr_Update |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
378 #define N Opr_NoType |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
379 //#define L Opr_Label |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
380 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
381 // D=dest, N=notype |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
382 static AsmOpInfo asmOpInfo[N_AsmOpInfo] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
383 /* Op_Invalid */ {}, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
384 /* Op_Adjust */ { 0,0,0, 0, Clb_EAX /*just AX*/ }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
385 /* Op_Dst */ { D|mr, 0, 0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
386 /* Op_Upd */ { U|mr, 0, 0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
387 /* Op_DstW */ { D|mr, 0, 0, Word_Types }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
388 /* Op_DstF */ { D|mr, 0, 0, 1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
389 /* Op_UpdF */ { U|mr, 0, 0, 1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
390 /* Op_DstSrc */ { D|mr, mri, 0,/**/1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
391 /* Op_DstSrcF */ { D|mr, mri, 0,/**/1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
392 /* Op_UpdSrcF */ { U|mr, mri, 0,/**/1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
393 /* Op_DstSrcFW */ { D|mr, mri, 0,/**/Word_Types, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
394 /* Op_UpdSrcFW */ { U|mr, mri, 0,/**/Word_Types, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
395 /* Op_DstSrcSSE */ { U|sse, ssem, 0 }, // some may not be update %% |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
396 /* Op_DstSrcMMX */ { U|mmx, mmxm, 0 }, // some may not be update %% |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
397 /* Op_DstSrcImmS*/ { U|sse, ssem, N|imm }, // some may not be update %% |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
398 /* Op_DstSrcImmM*/ { U|mmx, mmxm, N|imm }, // some may not be update %% |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
399 /* Op_UpdSrcShft*/ { U|mr, reg, N|shft, 1, Clb_Flags }, // 16/32 only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
400 /* Op_DstSrcNT */ { D|mr, mr, 0, 0 }, // used for movd .. operands can be rm32,sse,mmx |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
401 /* Op_UpdSrcNT */ { U|mr, mr, 0, 0 }, // used for movd .. operands can be rm32,sse,mmx |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
402 /* Op_DstMemNT */ { D|mem, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
403 /* Op_DstRMBNT */ { D|mr, 0, 0, Byte_NoType }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
404 /* Op_DstRMWNT */ { D|mr, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
405 /* Op_UpdUpd */ { U|mr,U|mr, 0,/**/1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
406 /* Op_UpdUpdF */ { U|mr,U|mr, 0,/**/1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
407 /* Op_Src */ { mri, 0, 0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
408 /* Op_SrcRMWNT */ { mr, 0, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
409 /* Op_SrcW */ { mri, 0, 0, Word_Types }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
410 /* Op_SrcImm */ { imm }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
411 /* Op_Src_DXAXF */ { mr, 0, 0, 1, Clb_SizeDXAX|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
412 /* Op_SrcMemNT */ { mem, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
413 /* Op_SrcMemNTF */ { mem, 0, 0, 0, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
414 /* Op_SrcSrc */ { mr, mri, 0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
415 /* Op_SrcSrcF */ { mr, mri, 0, 1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
416 /* Op_SrcSrcFW */ { mr, mri, 0, Word_Types, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
417 /* Op_SrcSrcSSEF*/ { sse, ssem, 0, 0, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
418 /* Op_SrcSrcMMX */ { mmx, mmx, 0, }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
419 /* Op_Shift */ { D|mr,N|shft, 0,/**/1, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
420 /* Op_Branch */ { mri }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
421 /* Op_CBranch */ { imm }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
422 /* Op_0 */ { 0,0,0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
423 /* Op_0_AX */ { 0,0,0, 0, Clb_SizeAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
424 /* Op_0_DXAX */ { 0,0,0, 0, Clb_SizeDXAX }, // but for cwd/cdq -- how do know the size.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
425 /* Op_Loop */ { imm, 0, 0, 0, Clb_CX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
426 /* Op_Flags */ { 0,0,0, 0, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
427 /* Op_F0_ST */ { 0,0,0, 0, Clb_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
428 /* Op_F0_P */ { 0,0,0, 0, Clb_ST }, // push, pops, etc. not sure how to inform gcc.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
429 /* Op_Fs_P */ { mem, 0, 0, 0, Clb_ST }, // " |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
430 /* Op_Fis */ { mem, 0, 0, FPInt_Types }, // only 16bit and 32bit, DMD defaults to 16bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
431 /* Op_Fis_ST */ { mem, 0, 0, FPInt_Types, Clb_ST }, // " |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
432 /* Op_Fis_P */ { mem, 0, 0, FPInt_Types, Clb_ST }, // push and pop, fild so also 64 bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
433 /* Op_Fid */ { D|mem, 0, 0, FPInt_Types }, // only 16bit and 32bit, DMD defaults to 16bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
434 /* Op_Fid_P */ { D|mem, 0, 0, FPInt_Types, Clb_ST }, // push and pop, fild so also 64 bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
435 /* Op_Ffd */ { D|mfp, 0, 0, FP_Types, 0, Next_Form, Op_FfdR }, // only 16bit and 32bit, DMD defaults to 16bit, reg form doesn't need type |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
436 /* Op_FfdR */ { D|rfp, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
437 /* Op_Ffd_P */ { D|mfp, 0, 0, FP_Types, Clb_ST, Next_Form, Op_FfdR_P, }, // pop, fld so also 80 bit, " |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
438 /* Op_FfdR_P */ { D|rfp, 0, 0, 0, Clb_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
439 /* Op_Fd_P */ { D|mem, 0, 0, 0, Clb_ST }, // " |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
440 /* Op_FdST */ { D|rfp, 0, 0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
441 /* Op_FMath */ { mfp, 0, 0, FP_Types, Clb_ST, Next_Form, Op_FdSTiSTi }, // and only single or double prec |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
442 /* Op_FdSTiSTi */ { D|rfp, rfp, 0, }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
443 /* Op_FPMath */ { D|rfp, rfp, 0, 0, Clb_ST, Next_Form, Op_F0_P }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
444 /* Op_FCmp */ { mfp, 0, 0, FP_Types, 0, Next_Form, Op_FCmp1 }, // DMD defaults to float ptr |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
445 /* Op_FCmp1 */ { rfp, 0, 0, 0, 0, Next_Form, Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
446 /* Op_FCmpP */ { mfp, 0, 0, FP_Types, 0, Next_Form, Op_FCmpP1 }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
447 /* Op_FCmpP1 */ { rfp, 0, 0, 0, 0, Next_Form, Op_F0_P }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
448 /* Op_FCmpFlg */ { rfp, rfp, 0, 0, Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
449 /* Op_FCmpFlgP */ { rfp, rfp, 0, 0, Clb_Flags }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
450 /* Op_fld */ { mfp, 0, 0, FP_Types, Clb_ST, Next_Form, Op_fldR }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
451 /* Op_fldR */ { rfp, 0, 0, 0, Clb_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
452 /* Op_fxch */ { D|rfp,D|rfp, 0, 0, Clb_ST, Next_Form, Op_fxch1 }, // not in intel manual?, but DMD allows it (gas won't), second arg must be ST |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
453 /* Op_fxch1 */ { D|rfp, 0, 0, 0, Clb_ST, Next_Form, Op_fxch0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
454 /* Op_fxch0 */ { 0, 0, 0, 0, Clb_ST }, // Also clobbers ST(1) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
455 /* Op_SizedStack*/ { 0, 0, 0, 0, Clb_SP }, // type suffix special case |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
456 /* Op_bound */ { mr, mri, 0, Word_Types }, // operands *not* reversed for gas |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
457 /* Op_bswap */ { D|r32 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
458 /* Op_cmps */ { mem, mem, 0, 1, Clb_DI|Clb_SI|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
459 /* Op_cmpsd */ { 0, 0, 0, 0, Clb_DI|Clb_SI|Clb_Flags, Next_Form, Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
460 /* Op_cmpsX */ { 0, 0, 0, 0, Clb_DI|Clb_SI|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
461 /* Op_cmpxchg8b */ { D|mem/*64*/,0,0, 0, Clb_SizeDXAX/*32*/|Clb_Flags, Out_Mnemonic, Mn_cmpxchg8b }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
462 /* Op_cmpxchg */ { D|mr, reg, 0, 1, Clb_SizeAX|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
463 /* Op_cpuid */ { 0,0,0 }, // Clobbers eax, ebx, ecx, and edx. Handled specially below. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
464 /* Op_enter */ { imm, imm }, // operands *not* reversed for gas, %% inform gcc of EBP clobber?, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
465 /* Op_fdisi */ { 0,0,0, 0, 0, Out_Mnemonic, Mn_fdisi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
466 /* Op_feni */ { 0,0,0, 0, 0, Out_Mnemonic, Mn_feni }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
467 /* Op_fsetpm */ { 0,0,0, 0, 0, Out_Mnemonic, Mn_fsetpm }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
468 /* Op_fXstsw */ { D|mr, 0, 0, }, // ax is the only allowed register |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
469 /* Op_imul */ { D|reg, mr, imm, 1, Clb_Flags, Next_Form, Op_imul2 }, // 16/32 only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
470 /* Op_imul2 */ { D|reg, mri, 0, 1, Clb_Flags, Next_Form, Op_imul1 }, // 16/32 only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
471 /* Op_imul1 */ { mr, 0, 0, 1, Clb_Flags|Clb_SizeDXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
472 /* Op_in */ { D|ax,N|port,0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
473 /* Op_ins */ { mem,N|dx, 0, 1, Clb_DI }, // can't override ES segment for this one |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
474 /* Op_insX */ { 0, 0, 0, 0, Clb_DI }, // output segment overrides %% needs work |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
475 /* Op_iret */ { 0,0,0, 0, 0, Out_Mnemonic, Mn_iretw }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
476 /* Op_iretd */ { 0,0,0, 0, 0, Out_Mnemonic, Mn_iret }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
477 /* Op_lods */ { mem, 0, 0, 1, Clb_SI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
478 /* Op_lodsX */ { 0, 0, 0, 0, Clb_SI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
479 /* Op_movs */ { mem, mem, 0, 1, Clb_DI|Clb_SI }, // only src/DS can be overridden |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
480 /* Op_movsd */ { 0, 0, 0, 0, Clb_DI|Clb_SI, Next_Form, Op_DstSrcSSE }, // %% gas doesn't accept movsd .. has to movsl |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
481 /* Op_movsX */ { 0, 0, 0, 0, Clb_DI|Clb_SI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
482 /* Op_movsx */ { D|reg, mr, 0, 1 }, // type suffix is special case |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
483 /* Op_movzx */ { D|reg, mr, 0, 1 }, // type suffix is special case |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
484 /* Op_mul */ { U|ax, mr, 0, 1, Clb_SizeDXAX|Clb_Flags, Next_Form, Op_Src_DXAXF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
485 /* Op_out */ { N|port,ax, 0, 1 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
486 /* Op_outs */ { N|dx, mem, 0, 1, Clb_SI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
487 /* Op_outsX */ { 0, 0, 0, 0, Clb_SI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
488 /* Op_push */ { mri, 0, 0, Word_Types, Clb_SP }, // would be Op_SrcW, but DMD defaults to 32-bit for immediate form |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
489 /* Op_ret */ { imm, 0, 0, 0, 0, Next_Form, Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
490 /* Op_retf */ { 0, 0, 0, 0, 0, Out_Mnemonic, Mn_lret }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
491 /* Op_scas */ { mem, 0, 0, 1, Clb_DI|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
492 /* Op_scasX */ { 0, 0, 0, 0, Clb_DI|Clb_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
493 /* Op_stos */ { mem, 0, 0, 1, Clb_DI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
494 /* Op_stosX */ { 0, 0, 0, 0, Clb_DI }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
495 /* Op_xlat */ { mem, 0, 0, 0, Clb_SizeAX } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
496 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
497 /// * Op_arpl */ { D|mr, reg }, // 16 only -> DstSrc |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
498 /// * Op_bsX */ { rw, mrw, 0, 1, Clb_Flags },//->srcsrcf |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
499 /// * Op_bt */ { mrw, riw, 0, 1, Clb_Flags },//->srcsrcf |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
500 /// * Op_btX */ { D|mrw, riw, 0, 1, Clb_Flags },//->dstsrcf .. immediate does not contribute to size |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
501 /// * Op_cmovCC */ { D|rw, mrw, 0, 1 } // ->dstsrc |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
502 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
503 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
504 #undef mri |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
505 #undef mr |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
506 #undef mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
507 #undef mfp |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
508 #undef reg |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
509 #undef imm |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
510 #undef sse |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
511 #undef ssem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
512 #undef mmx |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
513 #undef mmxm |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
514 #undef r32 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
515 #undef rw |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
516 #undef rfp |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
517 #undef port |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
518 #undef ax |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
519 #undef dx |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
520 #undef shft |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
521 #undef D |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
522 #undef U |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
523 #undef N |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
524 //#undef L |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
525 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
526 typedef struct { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
527 const char * inMnemonic; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
528 AsmOp asmOp; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
529 } AsmOpEnt; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
530 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
531 /* Some opcodes which have data size restrictions, but we don't check |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
532 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
533 cmov, l<segreg> ?, lea, lsl, shld |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
534 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
535 todo: push <immediate> is always the 32-bit form, even tho push <mem> is 16-bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
536 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
537 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
538 static AsmOpEnt opData[] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
539 { "aaa", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
540 { "aad", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
541 { "aam", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
542 { "aas", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
543 { "adc", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
544 { "add", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
545 { "addpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
546 { "addps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
547 { "addsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
548 { "addss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
549 { "addsubpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
550 { "addsubps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
551 { "align", Op_Align }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
552 { "and", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
553 { "andnpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
554 { "andnps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
555 { "andpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
556 { "andps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
557 { "arpl", Op_UpdSrcNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
558 { "bound", Op_bound }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
559 { "bsf", Op_SrcSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
560 { "bsr", Op_SrcSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
561 { "bswap", Op_bswap }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
562 { "bt", Op_SrcSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
563 { "btc", Op_UpdSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
564 { "btr", Op_UpdSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
565 { "bts", Op_UpdSrcFW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
566 { "call", Op_Branch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
567 { "cbw", Op_0_AX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
568 { "cdq", Op_0_DXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
569 { "clc", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
570 { "cld", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
571 { "clflush",Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
572 { "cli", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
573 { "clts", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
574 { "cmc", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
575 { "cmova", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
576 { "cmovae", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
577 { "cmovb", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
578 { "cmovbe", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
579 { "cmovc", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
580 { "cmove", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
581 { "cmovg", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
582 { "cmovge", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
583 { "cmovl", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
584 { "cmovle", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
585 { "cmovna", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
586 { "cmovnae",Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
587 { "cmovnb", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
588 { "cmovnbe",Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
589 { "cmovnc", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
590 { "cmovne", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
591 { "cmovng", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
592 { "cmovnge",Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
593 { "cmovnl", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
594 { "cmovnle",Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
595 { "cmovno", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
596 { "cmovnp", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
597 { "cmovns", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
598 { "cmovnz", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
599 { "cmovo", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
600 { "cmovp", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
601 { "cmovpe", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
602 { "cmovpo", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
603 { "cmovs", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
604 { "cmovz", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
605 { "cmp", Op_SrcSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
606 { "cmppd", Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
607 { "cmpps", Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
608 { "cmps", Op_cmps }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
609 { "cmpsb", Op_cmpsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
610 { "cmpsd", Op_cmpsd }, // string cmp, and SSE cmp |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
611 { "cmpss", Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
612 { "cmpsw", Op_cmpsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
613 { "cmpxch8b", Op_cmpxchg8b }, // %% DMD opcode typo? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
614 { "cmpxchg", Op_cmpxchg }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
615 { "comisd", Op_SrcSrcSSEF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
616 { "comiss", Op_SrcSrcSSEF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
617 { "cpuid", Op_cpuid }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
618 { "cvtdq2pd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
619 { "cvtdq2ps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
620 { "cvtpd2dq", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
621 { "cvtpd2pi", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
622 { "cvtpd2ps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
623 { "cvtpi2pd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
624 { "cvtpi2ps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
625 { "cvtps2dq", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
626 { "cvtps2pd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
627 { "cvtps2pi", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
628 { "cvtsd2si", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
629 { "cvtsd2ss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
630 { "cvtsi2sd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
631 { "cvtsi2ss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
632 { "cvtss2sd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
633 { "cvtss2si", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
634 { "cvttpd2dq", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
635 { "cvttpd2pi", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
636 { "cvttps2dq", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
637 { "cvttps2pi", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
638 { "cvttsd2si", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
639 { "cvttss2si", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
640 { "cwd", Op_0_DXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
641 { "cwde", Op_0_AX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
642 //{ "da", Op_ },// dunno what this is -- takes labels? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
643 { "daa", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
644 { "das", Op_Adjust }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
645 { "db", Op_db }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
646 { "dd", Op_dd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
647 { "de", Op_de }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
648 { "dec", Op_UpdF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
649 { "df", Op_df }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
650 { "di", Op_di }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
651 { "div", Op_Src_DXAXF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
652 { "divpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
653 { "divps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
654 { "divsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
655 { "divss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
656 { "dl", Op_dl }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
657 { "dq", Op_dl }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
658 { "ds", Op_ds }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
659 { "dt", Op_de }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
660 { "dw", Op_ds }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
661 { "emms", Op_0 }, // clobber all mmx/fp? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
662 { "enter", Op_enter }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
663 { "even", Op_Even }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
664 { "f2xm1", Op_F0_ST }, // %% most of these are update... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
665 { "fabs", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
666 { "fadd", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
667 { "faddp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
668 { "fbld", Op_Fs_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
669 { "fbstp", Op_Fd_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
670 { "fchs", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
671 { "fclex", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
672 { "fcmovb", Op_FdSTiSTi }, // but only ST(0) can be the destination -- should be FdST0STi |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
673 { "fcmovbe", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
674 { "fcmove", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
675 { "fcmovnb", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
676 { "fcmovnbe", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
677 { "fcmovne", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
678 { "fcmovnu", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
679 { "fcmovu", Op_FdSTiSTi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
680 { "fcom", Op_FCmp }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
681 { "fcomi", Op_FCmpFlg }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
682 { "fcomip", Op_FCmpFlgP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
683 { "fcomp", Op_FCmpP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
684 { "fcompp", Op_F0_P }, // pops twice |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
685 { "fcos", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
686 { "fdecstp",Op_F0_P }, // changes stack |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
687 { "fdisi", Op_fdisi }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
688 { "fdiv", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
689 { "fdivp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
690 { "fdivr", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
691 { "fdivrp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
692 { "feni", Op_feni }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
693 { "ffree", Op_FdST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
694 { "fiadd", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
695 { "ficom", Op_Fis }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
696 { "ficomp", Op_Fis_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
697 { "fidiv", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
698 { "fidivr", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
699 { "fild", Op_Fis_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
700 { "fimul", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
701 { "fincstp",Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
702 { "finit", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
703 { "fist", Op_Fid }, // only 16,32bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
704 { "fistp", Op_Fid_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
705 { "fisttp", Op_Fid_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
706 { "fisub", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
707 { "fisubr", Op_Fis_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
708 { "fld", Op_fld }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
709 { "fld1", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
710 { "fldcw", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
711 { "fldenv", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
712 { "fldl2e", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
713 { "fldl2t", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
714 { "fldlg2", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
715 { "fldln2", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
716 { "fldpi", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
717 { "fldz", Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
718 { "fmul", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
719 { "fmulp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
720 { "fnclex", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
721 { "fndisi", Op_fdisi }, // ?? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
722 { "fneni", Op_feni }, // ?? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
723 { "fninit", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
724 { "fnop", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
725 { "fnsave", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
726 { "fnstcw", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
727 { "fnstenv",Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
728 { "fnstsw", Op_fXstsw }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
729 { "fpatan", Op_F0_P }, // pop and modify new ST |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
730 { "fprem", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
731 { "fprem1", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
732 { "fptan", Op_F0_P }, // modify ST and push 1.0 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
733 { "frndint",Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
734 { "frstor", Op_SrcMemNT }, // but clobbers everything |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
735 { "fsave", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
736 { "fscale", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
737 { "fsetpm", Op_fsetpm }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
738 { "fsin", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
739 { "fsincos",Op_F0_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
740 { "fsqrt", Op_F0_ST }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
741 { "fst", Op_Ffd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
742 { "fstcw", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
743 { "fstenv", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
744 { "fstp", Op_Ffd_P }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
745 { "fstsw", Op_fXstsw }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
746 { "fsub", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
747 { "fsubp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
748 { "fsubr", Op_FMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
749 { "fsubrp", Op_FPMath }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
750 { "ftst", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
751 { "fucom", Op_FCmp }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
752 { "fucomi", Op_FCmpFlg }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
753 { "fucomip",Op_FCmpFlgP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
754 { "fucomp", Op_FCmpP }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
755 { "fucompp",Op_F0_P }, // pops twice |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
756 { "fwait", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
757 { "fxam", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
758 { "fxch", Op_fxch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
759 { "fxrstor",Op_SrcMemNT }, // clobbers FP,MMX,SSE |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
760 { "fxsave", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
761 { "fxtract",Op_F0_P }, // pushes |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
762 { "fyl2x", Op_F0_P }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
763 { "fyl2xp1",Op_F0_P }, // pops |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
764 { "haddpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
765 { "haddps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
766 { "hlt", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
767 { "hsubpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
768 { "hsubps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
769 { "idiv", Op_Src_DXAXF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
770 { "imul", Op_imul }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
771 { "in", Op_in }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
772 { "inc", Op_UpdF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
773 { "ins", Op_ins }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
774 { "insb", Op_insX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
775 { "insd", Op_insX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
776 { "insw", Op_insX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
777 { "int", Op_SrcImm }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
778 { "into", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
779 { "invd", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
780 { "invlpg", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
781 { "iret", Op_iret }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
782 { "iretd", Op_iretd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
783 { "ja", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
784 { "jae", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
785 { "jb", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
786 { "jbe", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
787 { "jc", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
788 { "jcxz", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
789 { "je", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
790 { "jecxz", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
791 { "jg", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
792 { "jge", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
793 { "jl", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
794 { "jle", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
795 { "jmp", Op_Branch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
796 { "jna", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
797 { "jnae", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
798 { "jnb", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
799 { "jnbe", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
800 { "jnc", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
801 { "jne", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
802 { "jng", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
803 { "jnge", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
804 { "jnl", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
805 { "jnle", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
806 { "jno", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
807 { "jnp", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
808 { "jns", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
809 { "jnz", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
810 { "jo", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
811 { "jp", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
812 { "jpe", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
813 { "jpo", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
814 { "js", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
815 { "jz", Op_CBranch }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
816 { "lahf", Op_0_AX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
817 { "lar", Op_DstSrcFW }, // reg dest only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
818 { "lddqu", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
819 { "ldmxcsr", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
820 { "lds", Op_DstSrc }, // reg dest only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
821 { "lea", Op_DstSrc }, // " |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
822 { "leave", Op_0 }, // EBP,ESP clobbers |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
823 { "les", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
824 { "lfence",Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
825 { "lfs", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
826 { "lgdt", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
827 { "lgs", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
828 { "lidt", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
829 { "lldt", Op_SrcRMWNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
830 { "lmsw", Op_SrcRMWNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
831 { "lock", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
832 { "lods", Op_lods }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
833 { "lodsb", Op_lodsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
834 { "lodsd", Op_lodsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
835 { "lodsw", Op_lodsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
836 { "loop", Op_Loop }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
837 { "loope", Op_Loop }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
838 { "loopne",Op_Loop }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
839 { "loopnz",Op_Loop }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
840 { "loopz", Op_Loop }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
841 { "lsl", Op_DstSrcFW }, // reg dest only |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
842 { "lss", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
843 { "ltr", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
844 { "maskmovdqu", Op_SrcSrcMMX }, // writes to [edi] |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
845 { "maskmovq", Op_SrcSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
846 { "maxpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
847 { "maxps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
848 { "maxsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
849 { "maxss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
850 { "mfence",Op_0}, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
851 { "minpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
852 { "minps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
853 { "minsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
854 { "minss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
855 { "monitor", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
856 { "mov", Op_DstSrc }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
857 { "movapd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
858 { "movaps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
859 { "movd", Op_DstSrcNT }, // also mmx and sse |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
860 { "movddup", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
861 { "movdq2q", Op_DstSrcNT }, // mmx/sse |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
862 { "movdqa", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
863 { "movdqu", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
864 { "movhlps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
865 { "movhpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
866 { "movhps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
867 { "movlhps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
868 { "movlpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
869 { "movlps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
870 { "movmskpd",Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
871 { "movmskps",Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
872 { "movntdq", Op_DstSrcNT }, // limited to sse, but mem dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
873 { "movnti", Op_DstSrcNT }, // limited to gpr, but mem dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
874 { "movntpd", Op_DstSrcNT }, // limited to sse, but mem dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
875 { "movntps", Op_DstSrcNT }, // limited to sse, but mem dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
876 { "movntq", Op_DstSrcNT }, // limited to mmx, but mem dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
877 { "movq", Op_DstSrcNT }, // limited to sse and mmx |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
878 { "movq2dq", Op_DstSrcNT }, // limited to sse <- mmx regs |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
879 { "movs", Op_movs }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
880 { "movsb", Op_movsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
881 { "movsd", Op_movsd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
882 { "movshdup", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
883 { "movsldup", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
884 { "movss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
885 { "movsw", Op_movsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
886 { "movsx", Op_movsx }, // word-only, reg dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
887 { "movupd",Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
888 { "movups",Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
889 { "movzx", Op_movzx }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
890 { "mul", Op_mul }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
891 { "mulpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
892 { "mulps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
893 { "mulsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
894 { "mulss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
895 { "mwait", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
896 { "naked", Op_Naked }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
897 { "neg", Op_UpdF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
898 { "nop", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
899 { "not", Op_Upd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
900 { "or", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
901 { "orpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
902 { "orps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
903 { "out", Op_out }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
904 { "outs", Op_outs }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
905 { "outsb", Op_outsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
906 { "outsd", Op_outsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
907 { "outsw", Op_outsX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
908 { "packssdw", Op_DstSrcMMX }, // %% also SSE |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
909 { "packsswb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
910 { "packuswb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
911 { "paddb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
912 { "paddd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
913 { "paddq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
914 { "paddsb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
915 { "paddsw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
916 { "paddusb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
917 { "paddusw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
918 { "paddw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
919 { "pand", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
920 { "pandn", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
921 { "pavgb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
922 { "pavgw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
923 { "pcmpeqb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
924 { "pcmpeqd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
925 { "pcmpeqw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
926 { "pcmpgtb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
927 { "pcmpgtd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
928 { "pcmpgtw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
929 { "pextrw", Op_DstSrcImmM }, // gpr32 dest |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
930 { "pinsrw", Op_DstSrcImmM }, // gpr32(16), mem16 src, sse too |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
931 { "pmaddwd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
932 { "pmaxsw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
933 { "pmaxub", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
934 { "pminsw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
935 { "pminub", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
936 { "pmovmskb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
937 { "pmulhuw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
938 { "pmulhw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
939 { "pmullw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
940 { "pmuludq", Op_DstSrcMMX }, // also sse |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
941 { "pop", Op_DstW }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
942 { "popa", Op_SizedStack }, // For intel this is always 16-bit |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
943 { "popad", Op_SizedStack }, // GAS doesn't accept 'popad' -- these clobber everything, but supposedly it would be used to preserve clobbered regs |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
944 { "popf", Op_SizedStack }, // rewrite the insn with a special case |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
945 { "popfd", Op_SizedStack }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
946 { "por", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
947 { "prefetchnta", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
948 { "prefetcht0", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
949 { "prefetcht1", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
950 { "prefetcht2", Op_SrcMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
951 { "psadbw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
952 { "pshufd", Op_DstSrcImmM }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
953 { "pshufhw", Op_DstSrcImmM }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
954 { "pshuflw", Op_DstSrcImmM }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
955 { "pshufw", Op_DstSrcImmM }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
956 { "pslld", Op_DstSrcMMX }, // immediate operands... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
957 { "pslldq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
958 { "psllq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
959 { "psllw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
960 { "psrad", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
961 { "psraw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
962 { "psrld", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
963 { "psrldq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
964 { "psrlq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
965 { "psrlw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
966 { "psubb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
967 { "psubd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
968 { "psubq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
969 { "psubsb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
970 { "psubsw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
971 { "psubusb", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
972 { "psubusw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
973 { "psubw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
974 { "punpckhbw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
975 { "punpckhdq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
976 { "punpckhqdq",Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
977 { "punpckhwd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
978 { "punpcklbw", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
979 { "punpckldq", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
980 { "punpcklqdq",Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
981 { "punpcklwd", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
982 { "push", Op_push }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
983 { "pusha", Op_SizedStack }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
984 { "pushad", Op_SizedStack }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
985 { "pushf", Op_SizedStack }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
986 { "pushfd", Op_SizedStack }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
987 { "pxor", Op_DstSrcMMX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
988 { "rcl", Op_Shift }, // limited src operands -- change to shift |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
989 { "rcpps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
990 { "rcpss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
991 { "rcr", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
992 { "rdmsr", Op_0_DXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
993 { "rdpmc", Op_0_DXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
994 { "rdtsc", Op_0_DXAX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
995 { "rep", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
996 { "repe", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
997 { "repne", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
998 { "repnz", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
999 { "repz", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1000 { "ret", Op_ret }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1001 { "retf", Op_retf }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1002 { "rol", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1003 { "ror", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1004 { "rsm", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1005 { "rsqrtps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1006 { "rsqrtss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1007 { "sahf", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1008 { "sal", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1009 { "sar", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1010 { "sbb", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1011 { "scas", Op_scas }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1012 { "scasb", Op_scasX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1013 { "scasd", Op_scasX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1014 { "scasw", Op_scasX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1015 { "seta", Op_DstRMBNT }, // also gpr8 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1016 { "setae", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1017 { "setb", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1018 { "setbe", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1019 { "setc", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1020 { "sete", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1021 { "setg", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1022 { "setge", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1023 { "setl", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1024 { "setle", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1025 { "setna", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1026 { "setnae", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1027 { "setnb", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1028 { "setnbe", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1029 { "setnc", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1030 { "setne", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1031 { "setng", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1032 { "setnge", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1033 { "setnl", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1034 { "setnle", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1035 { "setno", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1036 { "setnp", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1037 { "setns", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1038 { "setnz", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1039 { "seto", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1040 { "setp", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1041 { "setpe", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1042 { "setpo", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1043 { "sets", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1044 { "setz", Op_DstRMBNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1045 { "sfence", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1046 { "sgdt", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1047 { "shl", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1048 { "shld", Op_UpdSrcShft }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1049 { "shr", Op_Shift }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1050 { "shrd", Op_UpdSrcShft }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1051 { "shufpd", Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1052 { "shufps", Op_DstSrcImmS }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1053 { "sidt", Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1054 { "sldt", Op_DstRMWNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1055 { "smsw", Op_DstRMWNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1056 { "sqrtpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1057 { "sqrtps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1058 { "sqrtsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1059 { "sqrtss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1060 { "stc", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1061 { "std", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1062 { "sti", Op_Flags }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1063 { "stmxcsr",Op_DstMemNT }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1064 { "stos", Op_stos }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1065 { "stosb", Op_stosX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1066 { "stosd", Op_stosX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1067 { "stosw", Op_stosX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1068 { "str", Op_DstMemNT }, // also r16 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1069 { "sub", Op_UpdSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1070 { "subpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1071 { "subps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1072 { "subsd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1073 { "subss", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1074 { "sysenter",Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1075 { "sysexit", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1076 { "test", Op_SrcSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1077 { "ucomisd", Op_SrcSrcSSEF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1078 { "ucomiss", Op_SrcSrcSSEF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1079 { "ud2", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1080 { "unpckhpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1081 { "unpckhps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1082 { "unpcklpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1083 { "unpcklps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1084 { "verr", Op_SrcMemNTF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1085 { "verw", Op_SrcMemNTF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1086 { "wait", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1087 { "wbinvd", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1088 { "wrmsr", Op_0 }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1089 { "xadd", Op_UpdUpdF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1090 { "xchg", Op_UpdUpd }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1091 { "xlat", Op_xlat }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1092 { "xlatb", Op_0_AX }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1093 { "xor", Op_DstSrcF }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1094 { "xorpd", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1095 { "xorps", Op_DstSrcSSE }, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1096 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1097 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1098 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1099 Default_Ptr = 0, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1100 Byte_Ptr = 1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1101 Short_Ptr = 2, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1102 Int_Ptr = 4, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1103 QWord_Ptr = 8, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1104 Float_Ptr = 4, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1105 Double_Ptr = 8, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1106 Extended_Ptr = 10, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1107 Near_Ptr = 98, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1108 Far_Ptr = 99, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1109 N_PtrTypes |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1110 } PtrType; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1111 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1112 static const int N_PtrNames = 8; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1113 static const char * ptrTypeNameTable[N_PtrNames] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1114 "word", "dword", "qword", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1115 "float", "double", "extended", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1116 "near", "far" |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1117 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1118 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1119 static Identifier * ptrTypeIdentTable[N_PtrNames]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1120 static PtrType ptrTypeValueTable[N_PtrNames] = { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1121 Short_Ptr, Int_Ptr, QWord_Ptr, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1122 Float_Ptr, Double_Ptr, Extended_Ptr, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1123 Near_Ptr, Far_Ptr |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1124 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1125 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1126 typedef enum { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1127 Opr_Invalid, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1128 Opr_Immediate, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1129 Opr_Reg, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1130 Opr_Mem |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1131 } OperandClass; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1132 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1133 /* kill inlining if we reference a local? */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1134 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1135 /* DMD seems to allow only one 'symbol' per operand .. include __LOCAL_SIZE */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1136 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1137 /* DMD offset usage: <parm>[<reg>] seems to always be relative to EBP+8 .. even |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1138 if naked.. */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1139 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1140 // mov eax, 4 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1141 // mov eax, fs:4 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1142 // -- have to assume we know wheter or not to use '$' |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1143 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1144 static Token eof_tok; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1145 static Expression * Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1146 static Identifier * ident_seg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1147 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1148 struct AsmProcessor |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1149 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1150 typedef struct { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1151 int inBracket; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1152 int hasBracket; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1153 int hasNumber; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1154 int isOffset; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1155 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1156 Reg segmentPrefix; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1157 Reg reg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1158 sinteger_t constDisplacement; // use to build up.. should be int constant in the end.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1159 Array symbolDisplacement; // array of expressions or.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1160 Reg baseReg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1161 Reg indexReg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1162 int scale; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1163 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1164 OperandClass cls; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1165 PtrType dataSize; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1166 PtrType dataSizeHint; // DMD can use the type of a referenced variable |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1167 } Operand; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1168 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1169 static const unsigned Max_Operands = 3; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1170 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1171 AsmStatement * stmt; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1172 Scope * sc; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1173 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1174 Token * token; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1175 OutBuffer * insnTemplate; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1176 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1177 AsmOp op; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1178 AsmOpInfo * opInfo; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1179 Operand operands[Max_Operands]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1180 Identifier * opIdent; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1181 Operand * operand; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1182 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1183 AsmProcessor(Scope * sc, AsmStatement * stmt) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1184 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1185 this->sc = sc; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1186 this->stmt = stmt; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1187 token = stmt->tokens; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1188 insnTemplate = new OutBuffer; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1189 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1190 opInfo = NULL; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1191 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1192 if ( ! regInfo[0].ident ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1193 char buf[8], *p; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1194 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1195 for (int i = 0; i < N_Regs; i++) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1196 strncpy(buf, regInfo[i].name, sizeof(buf) - 1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1197 for (p = buf; *p; p++) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1198 *p = std::tolower(*p); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1199 regInfo[i].gccName = std::string(buf, p - buf); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1200 if ( (i <= Reg_ST || i > Reg_ST7) && i != Reg_EFLAGS ) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1201 regInfo[i].ident = Lexer::idPool(regInfo[i].name); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1202 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1203 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1204 for (int i = 0; i < N_PtrNames; i++) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1205 ptrTypeIdentTable[i] = Lexer::idPool(ptrTypeNameTable[i]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1206 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1207 Handled = new Expression(0, TOKvoid, sizeof(Expression)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1208 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1209 ident_seg = Lexer::idPool("seg"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1210 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1211 eof_tok.value = TOKeof; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1212 eof_tok.next = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1213 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1214 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1215 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1216 void run() |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1217 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1218 parse(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1219 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1220 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1221 void nextToken() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1222 if (token->next) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1223 token = token->next; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1224 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1225 token = & eof_tok; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1226 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1227 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1228 Token * peekToken() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1229 if (token->next) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1230 return token->next; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1231 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1232 return & eof_tok; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1233 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1234 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1235 void expectEnd() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1236 if (token->value != TOKeof) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1237 stmt->error("expected end of statement"); // %% extra at end... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1238 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1239 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1240 void parse() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1241 op = parseOpcode(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1242 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1243 switch (op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1244 case Op_Align: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1245 doAlign(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1246 expectEnd(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1247 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1248 case Op_Even: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1249 doEven(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1250 expectEnd(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1251 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1252 case Op_Naked: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1253 doNaked(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1254 expectEnd(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1255 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1256 case Op_Invalid: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1257 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1258 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1259 if (op >= Op_db && op <= Op_de) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1260 doData(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1261 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1262 doInstruction(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1263 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1264 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1265 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1266 AsmOp parseOpcode() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1267 static const int N_ents = sizeof(opData)/sizeof(AsmOpEnt); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1268 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1269 switch (token->value) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1270 case TOKalign: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1271 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1272 return Op_Align; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1273 case TOKin: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1274 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1275 opIdent = Id::___in; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1276 return Op_in; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1277 case TOKint32: // "int" |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1278 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1279 opIdent = Id::__int; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1280 return Op_SrcImm; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1281 case TOKout: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1282 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1283 opIdent = Id::___out; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1284 return Op_out; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1285 case TOKidentifier: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1286 // search for mnemonic below |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1287 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1288 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1289 stmt->error("expected opcode"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1290 return Op_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1291 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1292 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1293 opIdent = token->ident; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1294 const char * opcode = token->ident->string; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1295 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1296 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1297 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1298 // %% okay to use bsearch? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1299 int i = 0, j = N_ents, k, l; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1300 do { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1301 k = (i + j) / 2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1302 l = strcmp(opcode, opData[k].inMnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1303 if (! l) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1304 return opData[k].asmOp; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1305 else if (l < 0) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1306 j = k; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1307 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1308 i = k + 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1309 } while (i != j); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1310 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1311 stmt->error("unknown opcode '%s'", opcode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1312 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1313 return Op_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1314 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1315 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1316 // need clobber information.. use information is good too... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1317 void doInstruction() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1318 bool ok = true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1319 unsigned operand_i = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1320 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1321 opInfo = & asmOpInfo[op]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1322 memset(operands, 0, sizeof(operands)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1323 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1324 while (token->value != TOKeof) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1325 if (operand_i < Max_Operands) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1326 operand = & operands[operand_i]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1327 operand->reg = operand->baseReg = operand->indexReg = |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1328 operand->segmentPrefix = Reg_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1329 parseOperand(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1330 operand_i++; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1331 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1332 ok = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1333 stmt->error("too many operands for instruction"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1334 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1335 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1336 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1337 if (token->value == TOKcomma) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1338 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1339 else if (token->value != TOKeof) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1340 ok = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1341 stmt->error("expected comma after operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1342 return; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1343 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1344 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1345 // if (operand_i < opInfo->minOperands) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1346 // ok = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1347 // stmt->error("too few operands for instruction"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1348 // } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1349 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1350 if ( matchOperands(operand_i) ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1351 AsmCode * asmcode = new AsmCode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1352 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1353 if (formatInstruction(operand_i, asmcode)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1354 stmt->asmcode = (code *) asmcode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1355 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1356 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1357 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1358 void setAsmCode() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1359 AsmCode * asmcode = new AsmCode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1360 asmcode->insnTemplateLen = insnTemplate->offset; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1361 asmcode->insnTemplate = (char*) insnTemplate->extractData(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1362 stmt->asmcode = (code*) asmcode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1363 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1364 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1365 // note: doesn't update AsmOp op |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1366 bool matchOperands(unsigned nOperands) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1367 bool wrong_number = true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1368 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1369 for (unsigned i = 0; i < nOperands; i++) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1370 classifyOperand(& operands[i]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1371 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1372 while (1) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1373 if (nOperands == opInfo->nOperands()) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1374 wrong_number = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1375 /* Cases in which number of operands is not |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1376 enough for a match: Op_FCmp/Op_FCmp1, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1377 Op_FCmpP/Op_FCmpP1 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1378 for (unsigned i = 0; i < nOperands; i++) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1379 Operand * operand = & operands[i]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1380 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1381 switch (opInfo->operands[i] & Opr_ClassMask) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1382 case OprC_Mem: // no FPMem currently |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1383 if (operand->cls != Opr_Mem) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1384 goto no_match; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1385 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1386 case OprC_RFP: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1387 if (! (operand->reg >= Reg_ST && operand->reg <= Reg_ST7)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1388 goto no_match; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1389 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1390 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1391 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1392 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1393 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1394 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1395 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1396 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1397 no_match: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1398 if (opInfo->linkType == Next_Form) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1399 opInfo = & asmOpInfo[ op = (AsmOp) opInfo->link ]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1400 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1401 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1402 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1403 if (wrong_number) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1404 stmt->error("wrong number of operands"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1405 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1406 stmt->error("wrong operand types"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1407 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1408 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1409 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1410 void addOperand(const char * fmt, AsmArgType type, Expression * e, AsmCode * asmcode, AsmArgMode mode = Mode_Input) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1411 insnTemplate->writestring((char*) fmt); |
234
9760f54af0b7
[svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents:
232
diff
changeset
|
1412 insnTemplate->printf("<<%s%d>>", (mode==Mode_Input)?"in":"out", asmcode->args.dim); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1413 asmcode->args.push( new AsmArg(type, e, mode) ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1414 } |
231
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1415 void addOperand2(const char * fmtpre, const char * fmtpost, AsmArgType type, Expression * e, AsmCode * asmcode, AsmArgMode mode = Mode_Input) { |
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1416 insnTemplate->writestring((char*) fmtpre); |
234
9760f54af0b7
[svn r250] Fixed the warning about dropping arguments to _Dmain when optimizing.
lindquist
parents:
232
diff
changeset
|
1417 insnTemplate->printf("<<%s%d>>", (mode==Mode_Input)?"in":"out", asmcode->args.dim); |
231
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1418 insnTemplate->writestring((char*) fmtpost); |
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1419 asmcode->args.push( new AsmArg(type, e, mode) ); |
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1420 } |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1421 |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1422 void addLabel(char* id) { |
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1423 insnTemplate->writestring(id); |
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1424 } |
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1425 |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1426 /* Determines whether the operand is a register, memory reference |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1427 or immediate. Immediate addresses are currently classified as |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1428 memory. This function is called before the exact instructions |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1429 is known and thus, should not use opInfo. */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1430 void classifyOperand(Operand * operand) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1431 operand->cls = classifyOperand1(operand); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1432 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1433 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1434 OperandClass classifyOperand1(Operand * operand) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1435 bool is_localsize = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1436 bool really_have_symbol = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1437 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1438 if (operand->symbolDisplacement.dim) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1439 is_localsize = isLocalSize( (Expression *) operand->symbolDisplacement.data[0] ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1440 really_have_symbol = ! is_localsize; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1441 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1442 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1443 if (operand->isOffset && ! operand->hasBracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1444 return Opr_Immediate; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1445 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1446 if (operand->hasBracket || really_have_symbol) { // %% redo for 'offset' function |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1447 if (operand->reg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1448 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1449 return Opr_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1450 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1451 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1452 return Opr_Mem; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1453 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1454 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1455 if (operand->reg != Reg_Invalid && operand->constDisplacement != 0) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1456 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1457 return Opr_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1458 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1459 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1460 if (operand->segmentPrefix != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1461 if (operand->reg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1462 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1463 return Opr_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1464 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1465 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1466 return Opr_Mem; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1467 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1468 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1469 if (operand->reg != Reg_Invalid && ! operand->hasNumber) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1470 return Opr_Reg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1471 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1472 // should check immediate given (operand->hasNumber); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1473 // |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1474 if (operand->hasNumber || is_localsize) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1475 // size determination not correct if there are symbols Opr_Immediate |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1476 if (operand->dataSize == Default_Ptr) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1477 if (operand->constDisplacement < 0x100) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1478 operand->dataSize = Byte_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1479 else if (operand->constDisplacement < 0x10000) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1480 operand->dataSize = Short_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1481 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1482 operand->dataSize = Int_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1483 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1484 return Opr_Immediate; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1485 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1486 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1487 // probably a bug,? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1488 stmt->error("invalid operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1489 return Opr_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1490 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1491 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1492 void writeReg(Reg reg) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1493 insnTemplate->writestring((char*) "%"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1494 insnTemplate->write(regInfo[reg].gccName.c_str(), regInfo[reg].gccName.length()); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1495 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1496 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1497 bool opTakesLabel() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1498 switch(op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1499 case Op_Branch: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1500 case Op_CBranch: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1501 case Op_Loop: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1502 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1503 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1504 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1505 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1506 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1507 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1508 bool getTypeChar(TypeNeeded needed, PtrType ptrtype, char & type_char) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1509 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1510 switch (needed) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1511 case Byte_NoType: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1512 return ptrtype == Byte_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1513 case Word_Types: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1514 if (ptrtype == Byte_Ptr) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1515 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1516 // drop through |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1517 case Int_Types: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1518 switch (ptrtype) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1519 case Byte_Ptr: type_char = 'b'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1520 case Short_Ptr: type_char = 'w'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1521 case Int_Ptr: type_char = 'l'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1522 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1523 // %% these may be too strict |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1524 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1525 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1526 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1527 case FPInt_Types: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1528 switch (ptrtype) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1529 case Short_Ptr: type_char = 0; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1530 case Int_Ptr: type_char = 'l'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1531 case QWord_Ptr: type_char = 'q'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1532 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1533 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1534 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1535 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1536 case FP_Types: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1537 switch (ptrtype) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1538 case Float_Ptr: type_char = 's'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1539 case Double_Ptr: type_char = 'l'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1540 case Extended_Ptr: type_char = 't'; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1541 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1542 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1543 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1544 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1545 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1546 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1547 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1548 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1549 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1550 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1551 // also set impl clobbers |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1552 bool formatInstruction(int nOperands, AsmCode * asmcode) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1553 const char *fmt; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1554 const char *mnemonic; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1555 char type_char = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1556 bool use_star; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1557 AsmArgMode mode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1558 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1559 insnTemplate = new OutBuffer; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1560 // %% todo: special case for something.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1561 if (opInfo->linkType == Out_Mnemonic) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1562 mnemonic = alternateMnemonics[opInfo->link]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1563 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1564 mnemonic = opIdent->string; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1565 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1566 if (opInfo->needsType) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1567 PtrType exact_type = Default_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1568 PtrType min_type = Default_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1569 PtrType hint_type = Default_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1570 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1571 /* Default types: This attempts to match the observed behavior of DMD */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1572 switch (opInfo->needsType) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1573 case Int_Types: min_type = Byte_Ptr; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1574 case Word_Types: min_type = Short_Ptr; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1575 case FPInt_Types: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1576 if (op == Op_Fis_ST) // integer math instructions |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1577 min_type = Int_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1578 else // compare, load, store |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1579 min_type = Short_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1580 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1581 case FP_Types: min_type = Float_Ptr; break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1582 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1583 if (op == Op_push && operands[0].cls == Opr_Immediate) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1584 min_type = Int_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1585 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1586 for (int i = 0; i < nOperands; i++) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1587 if (hint_type == Default_Ptr && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1588 ! (opInfo->operands[i] & Opr_NoType)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1589 hint_type = operands[i].dataSizeHint; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1590 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1591 if ((opInfo->operands[i] & Opr_NoType) || |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1592 operands[i].dataSize == Default_Ptr) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1593 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1594 if (operands[i].cls == Opr_Immediate) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1595 min_type = operands[i].dataSize > min_type ? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1596 operands[i].dataSize : min_type; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1597 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1598 exact_type = operands[i].dataSize; // could check for conflicting types |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1599 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1600 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1601 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1602 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1603 bool type_ok; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1604 if (exact_type == Default_Ptr) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1605 type_ok = getTypeChar((TypeNeeded) opInfo->needsType, hint_type, type_char); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1606 if (! type_ok) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1607 type_ok = getTypeChar((TypeNeeded) opInfo->needsType, min_type, type_char); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1608 } else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1609 type_ok = getTypeChar((TypeNeeded) opInfo->needsType, exact_type, type_char); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1610 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1611 if (! type_ok) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1612 stmt->error("invalid operand size"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1613 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1614 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1615 } else if (op == Op_Branch) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1616 if (operands[0].dataSize == Far_Ptr) // %% type=Far_Ptr not set by Seg:Ofss OTOH, we don't support that.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1617 insnTemplate->writebyte('l'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1618 } else if (op == Op_fxch) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1619 // gas won't accept the two-operand form |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1620 if (operands[1].cls == Opr_Reg && operands[1].reg == Reg_ST) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1621 nOperands = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1622 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1623 stmt->error("invalid operands"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1624 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1625 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1626 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1627 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1628 switch (op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1629 case Op_SizedStack: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1630 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1631 int mlen = strlen(mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1632 if (mnemonic[mlen-1] == 'd') |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1633 insnTemplate->write(mnemonic, mlen-1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1634 else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1635 insnTemplate->writestring((char*) mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1636 insnTemplate->writebyte('w'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1637 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1638 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1639 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1640 case Op_cmpsd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1641 case Op_insX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1642 case Op_lodsX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1643 case Op_movsd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1644 case Op_outsX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1645 case Op_scasX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1646 case Op_stosX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1647 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1648 int mlen = strlen(mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1649 if (mnemonic[mlen-1] == 'd') { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1650 insnTemplate->write(mnemonic, mlen-1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1651 insnTemplate->writebyte('l'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1652 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1653 insnTemplate->writestring((char*) mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1654 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1655 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1656 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1657 case Op_movsx: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1658 case Op_movzx: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1659 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1660 char tc_1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1661 int mlen = strlen(mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1662 PtrType op1_size = operands[1].dataSize; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1663 if (op1_size == Default_Ptr) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1664 op1_size = operands[1].dataSizeHint; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1665 // Need type char for source arg |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1666 switch (op1_size) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1667 case Byte_Ptr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1668 case Default_Ptr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1669 tc_1 = 'b'; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1670 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1671 case Short_Ptr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1672 tc_1 = 'w'; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1673 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1674 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1675 stmt->error("invalid operand size/type"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1676 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1677 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1678 assert(type_char != 0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1679 insnTemplate->write(mnemonic, mlen-1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1680 insnTemplate->writebyte(tc_1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1681 insnTemplate->writebyte(type_char); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1682 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1683 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1684 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1685 insnTemplate->writestring((char*) mnemonic); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1686 if (type_char) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1687 insnTemplate->writebyte(type_char); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1688 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1689 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1690 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1691 switch (opInfo->implicitClobbers & Clb_DXAX_Mask) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1692 case Clb_SizeAX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1693 case Clb_EAX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1694 stmt->regs |= (1<<Reg_EAX); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1695 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1696 case Clb_SizeDXAX: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1697 stmt->regs |= (1<<Reg_EAX); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1698 if (type_char != 'b') |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1699 stmt->regs |= (1<<Reg_EDX); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1700 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1701 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1702 // nothing |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1703 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1704 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1705 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1706 if (opInfo->implicitClobbers & Clb_DI) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1707 stmt->regs |= (1 << Reg_EDI); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1708 if (opInfo->implicitClobbers & Clb_SI) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1709 stmt->regs |= (1 << Reg_ESI); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1710 if (opInfo->implicitClobbers & Clb_CX) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1711 stmt->regs |= (1 << Reg_ECX); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1712 if (opInfo->implicitClobbers & Clb_SP) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1713 stmt->regs |= (1 << Reg_ESP); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1714 if (opInfo->implicitClobbers & Clb_ST) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1715 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1716 /* Can't figure out how to tell GCC that an |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1717 asm statement leaves an arg pushed on the stack. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1718 Maybe if the statment had and input or output |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1719 operand it would work... In any case, clobbering |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1720 all FP prevents incorrect code generation. */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1721 stmt->regs |= (1 << Reg_ST); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1722 stmt->regs |= (1 << Reg_ST1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1723 stmt->regs |= (1 << Reg_ST2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1724 stmt->regs |= (1 << Reg_ST3); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1725 stmt->regs |= (1 << Reg_ST4); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1726 stmt->regs |= (1 << Reg_ST5); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1727 stmt->regs |= (1 << Reg_ST6); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1728 stmt->regs |= (1 << Reg_ST7); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1729 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1730 if (opInfo->implicitClobbers & Clb_Flags) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1731 asmcode->moreRegs |= (1 << (Reg_EFLAGS - 32)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1732 if (op == Op_cpuid) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1733 stmt->regs |= (1 << Reg_EAX)| |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1734 (1 << Reg_ECX)|(1 << Reg_EDX); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1735 |
220
ccc2e6898a78
[svn r236] added initial codegen of inline asm, pretty buggy and incomplete still. see the tangotests/asm1.d test for a sample of what does
lindquist
parents:
219
diff
changeset
|
1736 insnTemplate->writebyte(' '); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1737 for (int i__ = 0; i__ < nOperands; i__++) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1738 int i; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1739 if (i__ != 0) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1740 insnTemplate->writestring((char*) ", "); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1741 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1742 fmt = "$"; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1743 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1744 switch (op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1745 case Op_mul: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1746 // gas won't accept the two-operand form; skip to the source operand |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1747 i__ = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1748 // drop through |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1749 case Op_bound: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1750 case Op_enter: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1751 i = i__; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1752 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1753 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1754 i = nOperands - 1 - i__; // operand = & operands[ nOperands - 1 - i ]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1755 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1756 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1757 operand = & operands[ i ]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1758 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1759 switch (operand->cls) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1760 case Opr_Immediate: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1761 // for implementing offset: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1762 // $var + $7 // fails |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1763 // $var + 7 // ok |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1764 // $7 + $var // ok |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1765 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1766 // DMD doesn't seem to allow this |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1767 /* |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1768 if (opInfo->takesLabel()) tho... (near ptr <Number> would be abs?) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1769 fmt = "$a"; // GAS won't accept "jmp $42"; must be "jmp 42" (rel) or "jmp *42" (abs) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1770 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1771 if (opTakesLabel()/*opInfo->takesLabel()*/) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1772 // "relative addressing not allowed in branch instructions" .. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1773 stmt->error("integer constant not allowed in branch instructions"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1774 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1775 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1776 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1777 if (operand->symbolDisplacement.dim && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1778 isLocalSize( (Expression *) operand->symbolDisplacement.data[0] )) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1779 // handle __LOCAL_SIZE, which in this constant, is an immediate |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1780 // should do this in slotexp.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1781 addOperand("$", Arg_LocalSize, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1782 (Expression *) operand->symbolDisplacement.data[0], asmcode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1783 if (operand->constDisplacement) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1784 insnTemplate->writebyte('+'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1785 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1786 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1787 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1788 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1789 if (operand->symbolDisplacement.dim) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1790 fmt = "$a"; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1791 addOperand("$", Arg_Pointer, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1792 (Expression *) operand->symbolDisplacement.data[0], |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1793 asmcode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1794 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1795 if (operand->constDisplacement) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1796 insnTemplate->writebyte('+'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1797 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1798 // skip the addOperand(fmt, Arg_Integer...) below |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1799 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1800 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1801 addOperand(fmt, Arg_Integer, newIntExp(operand->constDisplacement), asmcode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1802 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1803 case Opr_Reg: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1804 if (opInfo->operands[i] & Opr_Dest) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1805 Reg clbr_reg = (Reg) regInfo[operand->reg].baseReg; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1806 if (clbr_reg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1807 if (clbr_reg < 32) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1808 stmt->regs |= (1 << clbr_reg); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1809 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1810 asmcode->moreRegs |= (1 << (clbr_reg - 32)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1811 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1812 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1813 if (opTakesLabel()/*opInfo->takesLabel()*/) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1814 insnTemplate->writebyte('*'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1815 writeReg(operand->reg); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1816 /* |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1817 insnTemplate->writestring("%"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1818 insnTemplate->writestring(regInfo[operand->reg].name); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1819 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1820 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1821 case Opr_Mem: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1822 // better: use output operands for simple variable references |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1823 if ( (opInfo->operands[i] & Opr_Update) == Opr_Update) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1824 mode = Mode_Update; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1825 } else if (opInfo->operands[i] & Opr_Dest) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1826 mode = Mode_Output; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1827 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1828 mode = Mode_Input; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1829 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1830 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1831 use_star = opTakesLabel();//opInfo->takesLabel(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1832 if (operand->segmentPrefix != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1833 writeReg(operand->segmentPrefix); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1834 insnTemplate->writebyte(':'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1835 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1836 if (operand->symbolDisplacement.dim) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1837 Expression * e = (Expression *) operand->symbolDisplacement.data[0]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1838 Declaration * decl = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1839 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1840 if (e->op == TOKvar) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1841 decl = ((VarExp *) e)->var; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1842 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1843 if (operand->baseReg != Reg_Invalid && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1844 decl && ! decl->isDataseg()) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1845 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1846 // Use the offset from frame pointer |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1847 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1848 /* GCC doesn't give the front end access to stack offsets |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1849 when optimization is turned on (3.x) or at all (4.x). |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1850 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1851 Try to convert var[EBP] (or var[ESP] for naked funcs) to |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1852 a memory expression that does not require us to know |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1853 the stack offset. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1854 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1855 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1856 if (operand->indexReg == Reg_Invalid && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1857 decl->isVarDeclaration() && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1858 ((operand->baseReg == Reg_EBP && ! sc->func->naked ) || |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1859 (operand->baseReg == Reg_ESP && sc->func->naked)) ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1860 |
221
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1861 if (mode == Mode_Output) |
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1862 { |
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1863 e = new AddrExp(0, e); |
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1864 e->type = decl->type->pointerTo(); |
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1865 } |
68687d8c3e9a
[svn r237] some inline asm output now seems to work, see tangotests/asm2.d
lindquist
parents:
220
diff
changeset
|
1866 |
220
ccc2e6898a78
[svn r236] added initial codegen of inline asm, pretty buggy and incomplete still. see the tangotests/asm1.d test for a sample of what does
lindquist
parents:
219
diff
changeset
|
1867 #if !IN_LLVM |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1868 /* DMD uses the same frame offsets for naked functions. */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1869 if (sc->func->naked) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1870 operand->constDisplacement += 4; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1871 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1872 if (operand->constDisplacement) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1873 e = new AddExp(0, e, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1874 new IntegerExp(0, operand->constDisplacement, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1875 Type::tint32)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1876 e->type = decl->type->pointerTo(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1877 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1878 e = new PtrExp(0, e); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1879 e->type = decl->type; |
220
ccc2e6898a78
[svn r236] added initial codegen of inline asm, pretty buggy and incomplete still. see the tangotests/asm1.d test for a sample of what does
lindquist
parents:
219
diff
changeset
|
1880 #endif |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1881 operand->constDisplacement = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1882 operand->baseReg = Reg_Invalid; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1883 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1884 addOperand(fmt, Arg_Memory, e, asmcode, mode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1885 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1886 } else { |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1887 addOperand2("${",":a}", Arg_FrameRelative, e, asmcode); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1888 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1889 if (opInfo->operands[i] & Opr_Dest) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1890 asmcode->clobbersMemory = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1891 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1892 // Plain memory reference to variable |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1893 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1894 /* If in a reg, DMD moves to memory.. even with -O, so we'll do the same |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1895 by always using the "m" contraint. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1896 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1897 In order to get the correct output for function and label symbols, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1898 the %an format must be used with the "p" constraint. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1899 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1900 if (isDollar(e)) { |
304 | 1901 error("dollar labels are not supported", stmt->loc.toChars()); |
1902 asmcode->dollarLabel = 1; | |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1903 } else if (e->op == TOKdsymbol) { |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1904 LabelDsymbol * lbl = (LabelDsymbol *) ((DsymbolExp *) e)->s; |
302 | 1905 stmt->isBranchToLabel = lbl; |
299
df8a7b8d5929
[svn r320] Begun work on branches out of asm blocks. Unfinished.
ChristianK
parents:
239
diff
changeset
|
1906 |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1907 use_star = false; |
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1908 addLabel(lbl->ident->toChars()); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1909 } else if ((decl && decl->isCodeseg())) { // if function or label |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1910 use_star = false; |
231
61aa721a6b7f
[svn r247] fixed accessing global symbols from inline asm.
lindquist
parents:
229
diff
changeset
|
1911 addOperand2("${", ":c}", Arg_Pointer, e, asmcode); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1912 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1913 if (use_star) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1914 insnTemplate->writebyte('*'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1915 use_star = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1916 } |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1917 Type* tt = e->type->pointerTo(); |
222
251548c1035d
[svn r238] use *m for memory input constraints and pass in their address
ChristianK
parents:
221
diff
changeset
|
1918 e = new AddrExp(0, e); |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1919 e->type = tt; |
222
251548c1035d
[svn r238] use *m for memory input constraints and pass in their address
ChristianK
parents:
221
diff
changeset
|
1920 |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1921 addOperand(fmt, Arg_Memory, e, asmcode, mode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1922 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1923 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1924 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1925 if (use_star) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1926 insnTemplate->writebyte('*'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1927 if (operand->constDisplacement) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1928 if (operand->symbolDisplacement.dim) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1929 insnTemplate->writebyte('+'); |
232
092468448d25
[svn r248] Fixed: labels in inline asm block now work for the normal case.
lindquist
parents:
231
diff
changeset
|
1930 addOperand2("${",":a}", Arg_Integer, newIntExp(operand->constDisplacement), asmcode); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1931 if (opInfo->operands[i] & Opr_Dest) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1932 asmcode->clobbersMemory = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1933 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1934 if (operand->baseReg != Reg_Invalid || operand->indexReg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1935 insnTemplate->writebyte('('); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1936 if (operand->baseReg != Reg_Invalid) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1937 writeReg(operand->baseReg); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1938 if (operand->indexReg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1939 insnTemplate->writebyte(','); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1940 writeReg(operand->indexReg); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1941 if (operand->scale) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1942 insnTemplate->printf(",%d", operand->scale); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1943 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1944 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1945 insnTemplate->writebyte(')'); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1946 if (opInfo->operands[i] & Opr_Dest) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1947 asmcode->clobbersMemory = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1948 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1949 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1950 case Opr_Invalid: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1951 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1952 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1953 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1954 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1955 asmcode->insnTemplateLen = insnTemplate->offset; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1956 asmcode->insnTemplate = (char*) insnTemplate->extractData(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1957 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1958 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1959 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1960 bool isIntExp(Expression * exp) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1961 if (exp->op == TOKint64) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1962 return 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1963 if (exp->op == TOKvar) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1964 Declaration * v = ((VarExp *) exp)->var; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1965 if (v->isConst() && v->type->isintegral()) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1966 return 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1967 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1968 return 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1969 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1970 bool isRegExp(Expression * exp) { return exp->op == TOKmod; } // ewww.%% |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1971 bool isLocalSize(Expression * exp) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1972 // cleanup: make a static var |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1973 return exp->op == TOKidentifier && ((IdentifierExp *) exp)->ident == Id::__LOCAL_SIZE; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1974 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1975 bool isDollar(Expression * exp) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1976 return exp->op == TOKidentifier && ((IdentifierExp *) exp)->ident == Id::__dollar; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1977 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1978 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1979 Expression * newRegExp(int regno) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1980 IntegerExp * e = new IntegerExp(regno); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1981 e->op = TOKmod; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1982 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1983 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1984 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1985 Expression * newIntExp(int v /* %% type */) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1986 // Only handles 32-bit numbers as this is IA-32. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1987 return new IntegerExp(stmt->loc, v, Type::tint32); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1988 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1989 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1990 void slotExp(Expression * exp) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1991 /* |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1992 if offset, make a note |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1993 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1994 if integer, add to immediate |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1995 if reg: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1996 if not in bracket, set reg (else error) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1997 if in bracket: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1998 if not base, set base |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
1999 if not index, set index |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2000 else, error |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2001 if symbol: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2002 set symbol field |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2003 */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2004 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2005 bool is_offset = false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2006 if (exp->op == TOKaddress) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2007 exp = ((AddrExp *) exp)->e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2008 is_offset = true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2009 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2010 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2011 if (isIntExp(exp)) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2012 if (is_offset) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2013 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2014 operand->constDisplacement += exp->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2015 if (! operand->inBracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2016 operand->hasNumber = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2017 } else if (isRegExp(exp)) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2018 if (is_offset) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2019 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2020 if (! operand->inBracket) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2021 if (operand->reg == Reg_Invalid) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2022 operand->reg = (Reg) exp->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2023 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2024 stmt->error("too many registers in operand (use brackets)"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2025 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2026 if (operand->baseReg == Reg_Invalid) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2027 operand->baseReg = (Reg) exp->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2028 else if (operand->indexReg == Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2029 operand->indexReg = (Reg) exp->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2030 operand->scale = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2031 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2032 stmt->error("too many registers memory operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2033 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2034 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2035 } else if (exp->op == TOKvar) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2036 VarDeclaration * v = ((VarExp *) exp)->var->isVarDeclaration(); |
239
fa691b1c0498
[svn r256] AsmBlockStatement was still being flattened in some cases.
lindquist
parents:
234
diff
changeset
|
2037 v->needsStorage = true; |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2038 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2039 if (v && v->storage_class & STCfield) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2040 operand->constDisplacement += v->offset; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2041 if (! operand->inBracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2042 operand->hasNumber = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2043 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2044 if (v && v->type->isscalar()) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2045 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2046 // DMD doesn't check Tcomplex*, and counts Tcomplex32 as Tfloat64 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2047 TY ty = v->type->toBasetype()->ty; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2048 operand->dataSizeHint = ty == Tfloat80 || ty == Timaginary80 ? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2049 Extended_Ptr : (PtrType) v->type->size(0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2050 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2051 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2052 if (! operand->symbolDisplacement.dim) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2053 if (is_offset && ! operand->inBracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2054 operand->isOffset = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2055 operand->symbolDisplacement.push( exp ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2056 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2057 stmt->error("too many symbols in operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2058 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2059 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2060 } else if (exp->op == TOKidentifier || exp->op == TOKdsymbol) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2061 // %% localsize could be treated as a simple constant.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2062 // change to addSymbolDisp(e) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2063 if (! operand->symbolDisplacement.dim) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2064 operand->symbolDisplacement.push( exp ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2065 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2066 stmt->error("too many symbols in operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2067 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2068 } else if (exp == Handled) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2069 // nothing |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2070 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2071 stmt->error("invalid operand"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2072 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2073 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2074 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2075 void invalidExpression() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2076 // %% report operand number |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2077 stmt->error("invalid expression"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2078 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2079 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2080 Expression * intOp(TOK op, Expression * e1, Expression * e2) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2081 Expression * e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2082 if (isIntExp(e1) && (! e2 || isIntExp(e2))) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2083 switch (op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2084 case TOKadd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2085 if (e2) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2086 e = new AddExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2087 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2088 e = e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2089 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2090 case TOKmin: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2091 if (e2) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2092 e = new MinExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2093 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2094 e = new NegExp(stmt->loc, e1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2095 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2096 case TOKmul: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2097 e = new MulExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2098 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2099 case TOKdiv: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2100 e = new DivExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2101 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2102 case TOKmod: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2103 e = new ModExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2104 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2105 case TOKshl: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2106 e = new ShlExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2107 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2108 case TOKshr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2109 e = new ShrExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2110 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2111 case TOKushr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2112 e = new UshrExp(stmt->loc, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2113 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2114 case TOKnot: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2115 e = new NotExp(stmt->loc, e1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2116 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2117 case TOKtilde: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2118 e = new ComExp(stmt->loc, e1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2119 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2120 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2121 assert(0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2122 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2123 e = e->semantic(sc); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2124 return e->optimize(WANTvalue | WANTinterpret); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2125 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2126 stmt->error("expected integer operand(s) for '%s'", Token::tochars[op]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2127 return newIntExp(0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2128 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2129 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2130 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2131 void parseOperand() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2132 Expression * exp = parseAsmExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2133 slotExp(exp); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2134 if (isRegExp(exp)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2135 operand->dataSize = (PtrType) regInfo[exp->toInteger()].size; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2136 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2137 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2138 Expression * parseAsmExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2139 return parseShiftExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2140 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2141 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2142 Expression * parseShiftExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2143 Expression * e1 = parseAddExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2144 Expression * e2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2145 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2146 while (1) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2147 TOK tv = token->value; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2148 switch (tv) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2149 case TOKshl: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2150 case TOKshr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2151 case TOKushr: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2152 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2153 e2 = parseAddExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2154 e1 = intOp(tv, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2155 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2156 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2157 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2158 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2159 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2160 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2161 return e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2162 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2163 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2164 Expression * parseAddExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2165 Expression * e1 = parseMultExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2166 Expression * e2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2167 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2168 while (1) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2169 TOK tv = token->value; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2170 switch (tv) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2171 case TOKadd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2172 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2173 e2 = parseMultExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2174 if (isIntExp(e1) && isIntExp(e2)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2175 e1 = intOp(tv, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2176 else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2177 slotExp(e1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2178 slotExp(e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2179 e1 = Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2180 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2181 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2182 case TOKmin: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2183 // Note: no support for symbol address difference |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2184 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2185 e2 = parseMultExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2186 if (isIntExp(e1) && isIntExp(e2)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2187 e1 = intOp(tv, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2188 else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2189 slotExp(e1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2190 e2 = intOp(TOKmin, e2, NULL); // verifies e2 is an int |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2191 slotExp(e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2192 e1 = Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2193 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2194 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2195 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2196 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2197 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2198 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2199 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2200 return e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2201 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2202 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2203 bool tryScale(Expression * e1, Expression * e2) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2204 Expression * et; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2205 if (isIntExp(e1) && isRegExp(e2)) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2206 et = e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2207 e1 = e2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2208 e2 = et; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2209 goto do_scale; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2210 } else if (isRegExp(e1) && isIntExp(e2)) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2211 do_scale: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2212 if (! operand->inBracket) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2213 invalidExpression(); // maybe should allow, e.g. DS:EBX+EAX*4 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2214 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2215 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2216 if (operand->scale || operand->indexReg != Reg_Invalid) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2217 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2218 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2219 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2220 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2221 operand->indexReg = (Reg) e1->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2222 operand->scale = e2->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2223 switch (operand->scale) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2224 case 1: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2225 case 2: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2226 case 4: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2227 case 8: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2228 // ok; do nothing |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2229 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2230 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2231 stmt->error("invalid index register scale '%d'", operand->scale); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2232 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2233 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2234 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2235 return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2236 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2237 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2238 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2239 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2240 Expression * parseMultExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2241 Expression * e1 = parseBrExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2242 Expression * e2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2243 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2244 while (1) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2245 TOK tv = token->value; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2246 switch (tv) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2247 case TOKmul: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2248 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2249 e2 = parseMultExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2250 if (isIntExp(e1) && isIntExp(e2)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2251 e1 = intOp(tv, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2252 else if (tryScale(e1,e2)) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2253 e1 = Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2254 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2255 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2256 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2257 case TOKdiv: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2258 case TOKmod: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2259 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2260 e2 = parseMultExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2261 e1 = intOp(tv, e1, e2); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2262 continue; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2263 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2264 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2265 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2266 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2267 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2268 return e1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2269 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2270 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2271 Expression * parseBrExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2272 // %% check (why is bracket lower precends..) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2273 // 3+4[eax] -> 3 + (4 [EAX]) .. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2274 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2275 // only one bracked allowed, so this doesn't quite handle |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2276 // the spec'd syntax |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2277 Expression * e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2278 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2279 if (token->value == TOKlbracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2280 e = Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2281 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2282 e = parseUnaExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2283 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2284 // DMD allows multiple bracket expressions. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2285 while (token->value == TOKlbracket) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2286 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2287 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2288 operand->inBracket = operand->hasBracket = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2289 slotExp(parseAsmExp()); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2290 operand->inBracket = 0; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2291 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2292 if (token->value == TOKrbracket) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2293 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2294 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2295 stmt->error("missing ']'"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2296 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2297 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2298 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2299 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2300 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2301 PtrType isPtrType(Token * tok) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2302 switch (tok->value) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2303 case TOKint8: return Byte_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2304 case TOKint16: return Short_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2305 case TOKint32: return Int_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2306 // 'long ptr' isn't accepted? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2307 case TOKfloat32: return Float_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2308 case TOKfloat64: return Double_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2309 case TOKfloat80: return Extended_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2310 case TOKidentifier: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2311 for (int i = 0; i < N_PtrNames; i++) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2312 if (tok->ident == ptrTypeIdentTable[i]) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2313 return ptrTypeValueTable[i]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2314 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2315 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2316 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2317 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2318 return Default_Ptr; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2319 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2320 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2321 Expression * parseUnaExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2322 Expression * e = NULL; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2323 PtrType ptr_type; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2324 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2325 // First, check for type prefix. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2326 if (token->value != TOKeof && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2327 peekToken()->value == TOKidentifier && |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2328 peekToken()->ident == Id::ptr) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2329 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2330 ptr_type = isPtrType(token); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2331 if (ptr_type != Default_Ptr) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2332 if (operand->dataSize == Default_Ptr) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2333 operand->dataSize = ptr_type; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2334 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2335 stmt->error("multiple specifications of operand size"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2336 } else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2337 stmt->error("unknown operand size '%s'", token->toChars()); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2338 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2339 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2340 return parseAsmExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2341 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2342 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2343 TOK tv = token->value; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2344 switch (tv) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2345 case TOKidentifier: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2346 if (token->ident == ident_seg) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2347 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2348 stmt->error("'seg' not supported"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2349 e = parseAsmExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2350 } else if (token->ident == Id::offset || |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2351 token->ident == Id::offsetof) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2352 if (token->ident == Id::offset && ! global.params.useDeprecated) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2353 stmt->error("offset deprecated, use offsetof"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2354 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2355 e = parseAsmExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2356 e = new AddrExp(stmt->loc, e); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2357 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2358 // primary exp |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2359 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2360 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2361 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2362 case TOKadd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2363 case TOKmin: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2364 case TOKnot: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2365 case TOKtilde: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2366 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2367 e = parseUnaExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2368 return intOp(tv, e, NULL); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2369 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2370 // primary exp |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2371 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2372 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2373 return parsePrimaryExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2374 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2375 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2376 Expression * parsePrimaryExp() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2377 Expression * e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2378 Identifier * ident = NULL; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2379 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2380 switch (token->value) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2381 case TOKint32v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2382 case TOKuns32v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2383 case TOKint64v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2384 case TOKuns64v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2385 // semantic here? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2386 // %% for tok64 really should use 64bit type |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2387 e = new IntegerExp(stmt->loc, token->uns64value, Type::tint32); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2388 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2389 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2390 case TOKfloat32v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2391 case TOKfloat64v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2392 case TOKfloat80v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2393 // %% need different types? |
229
cac3d27ae481
[svn r245] initial support for labels in inline asm, broken :/
lindquist
parents:
227
diff
changeset
|
2394 if (global.params.useFP80) |
cac3d27ae481
[svn r245] initial support for labels in inline asm, broken :/
lindquist
parents:
227
diff
changeset
|
2395 e = new RealExp(stmt->loc, token->float80value, Type::tfloat80); |
cac3d27ae481
[svn r245] initial support for labels in inline asm, broken :/
lindquist
parents:
227
diff
changeset
|
2396 else |
cac3d27ae481
[svn r245] initial support for labels in inline asm, broken :/
lindquist
parents:
227
diff
changeset
|
2397 e = new RealExp(stmt->loc, token->float80value, Type::tfloat64); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2398 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2399 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2400 case TOKidentifier: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2401 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2402 ident = token->ident; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2403 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2404 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2405 if (ident == Id::__LOCAL_SIZE) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2406 return new IdentifierExp(stmt->loc, ident); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2407 } else if (ident == Id::__dollar) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2408 do_dollar: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2409 return new IdentifierExp(stmt->loc, ident); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2410 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2411 e = new IdentifierExp(stmt->loc, ident); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2412 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2413 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2414 // If this is more than one component ref, it gets complicated: *(&Field + n) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2415 // maybe just do one step at a time.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2416 // simple case is Type.f -> VarDecl(field) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2417 // actually, DMD only supports on level... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2418 // X.y+Y.z[EBX] is supported, tho.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2419 // %% doesn't handle properties (check%%) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2420 while (token->value == TOKdot) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2421 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2422 if (token->value == TOKidentifier) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2423 e = new DotIdExp(stmt->loc, e, token->ident); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2424 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2425 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2426 stmt->error("expected identifier"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2427 return Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2428 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2429 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2430 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2431 // check for reg first then dotexp is an error? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2432 if (e->op == TOKidentifier) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2433 for (int i = 0; i < N_Regs; i++) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2434 if (ident == regInfo[i].ident) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2435 if ( (Reg) i == Reg_ST && token->value == TOKlparen) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2436 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2437 switch (token->value) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2438 case TOKint32v: case TOKuns32v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2439 case TOKint64v: case TOKuns64v: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2440 if (token->uns64value < 8) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2441 e = newRegExp( (Reg) (Reg_ST + token->uns64value) ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2442 else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2443 stmt->error("invalid floating point register index"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2444 e = Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2445 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2446 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2447 if (token->value == TOKrparen) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2448 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2449 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2450 stmt->error("expected ')'"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2451 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2452 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2453 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2454 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2455 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2456 return Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2457 } else if (token->value == TOKcolon) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2458 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2459 if (operand->segmentPrefix != Reg_Invalid) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2460 stmt->error("too many segment prefixes"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2461 else if (i >= Reg_CS && i <= Reg_GS) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2462 operand->segmentPrefix = (Reg) i; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2463 else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2464 stmt->error("'%s' is not a segment register", ident->string); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2465 return parseAsmExp(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2466 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2467 return newRegExp( (Reg) i ); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2468 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2469 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2470 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2471 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2472 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2473 if (opTakesLabel()/*opInfo->takesLabel()*/ && e->op == TOKidentifier) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2474 // DMD uses labels secondarily to other symbols, so check |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2475 // if IdentifierExp::semantic won't find anything. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2476 Dsymbol *scopesym; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2477 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2478 if ( ! sc->search(stmt->loc, ident, & scopesym) ) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2479 return new DsymbolExp(stmt->loc, |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2480 sc->func->searchLabel( ident )); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2481 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2482 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2483 e = e->semantic(sc); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2484 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2485 // Special case for floating point constant declarations. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2486 if (e->op == TOKfloat64) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2487 Dsymbol * sym = sc->search(stmt->loc, ident, NULL); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2488 if ( sym ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2489 VarDeclaration *v = sym->isVarDeclaration(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2490 if ( v ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2491 Expression *ve = new VarExp(stmt->loc, v); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2492 ve->type = e->type; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2493 e = ve; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2494 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2495 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2496 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2497 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2498 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2499 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2500 case TOKdollar: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2501 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2502 ident = Id::__dollar; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2503 goto do_dollar; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2504 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2505 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2506 invalidExpression(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2507 return Handled; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2508 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2509 return e; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2510 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2511 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2512 void doAlign() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2513 // .align bits vs. bytes... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2514 // apparently a.out platforms use bits instead of bytes... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2515 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2516 // parse primary: DMD allows 'MyAlign' (const int) but not '2+2' |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2517 // GAS is padding with NOPs last time I checked. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2518 Expression * e = parseAsmExp()->optimize(WANTvalue | WANTinterpret); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2519 integer_t align = e->toInteger(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2520 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2521 if (align >= 0) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2522 // %% is this printf portable? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2523 #ifdef HAVE_GAS_BALIGN_AND_P2ALIGN |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2524 insnTemplate->printf(".balign\t%u", (unsigned) align); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2525 #else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2526 insnTemplate->printf(".align\t%u", (unsigned) align); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2527 #endif |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2528 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2529 stmt->error("alignment must be a power of 2"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2530 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2531 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2532 setAsmCode(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2533 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2534 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2535 void doEven() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2536 // .align for GAS is in bits, others probably use bytes.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2537 #ifdef HAVE_GAS_BALIGN_AND_P2ALIGN |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2538 insnTemplate->writestring((char *) ".align\t2"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2539 #else |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2540 insnTemplate->writestring((char *) ".align\t2"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2541 #endif |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2542 setAsmCode(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2543 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2544 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2545 void doNaked() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2546 // %% can we assume sc->func != 0? |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2547 sc->func->naked = 1; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2548 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2549 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2550 void doData() { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2551 static const char * directives[] = { ".byte", ".short", ".long", ".long", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2552 "", "", "" }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2553 // FIXME |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2554 /* |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2555 machine_mode mode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2556 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2557 insnTemplate->writestring((char*) directives[op - Op_db]); |
220
ccc2e6898a78
[svn r236] added initial codegen of inline asm, pretty buggy and incomplete still. see the tangotests/asm1.d test for a sample of what does
lindquist
parents:
219
diff
changeset
|
2558 insnTemplate->writebyte(' '); |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2559 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2560 do { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2561 // DMD is pretty strict here, not even constant expressions are allowed.. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2562 switch (op) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2563 case Op_db: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2564 case Op_ds: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2565 case Op_di: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2566 case Op_dl: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2567 if (token->value == TOKint32v || token->value == TOKuns32v || |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2568 token->value == TOKint64v || token->value == TOKuns64v) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2569 // As per usual with GNU, assume at least 32-bit host |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2570 if (op != Op_dl) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2571 insnTemplate->printf("%u", (d_uns32) token->uns64value); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2572 else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2573 // Output two .longS. GAS has .quad, but would have to rely on 'L' format .. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2574 // just need to use HOST_WIDE_INT_PRINT_DEC |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2575 insnTemplate->printf("%u,%u", |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2576 (d_uns32) token->uns64value, (d_uns32) (token->uns64value >> 32)); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2577 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2578 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2579 stmt->error("expected integer constant"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2580 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2581 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2582 case Op_df: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2583 mode = SFmode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2584 goto do_float; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2585 case Op_dd: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2586 mode = DFmode; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2587 goto do_float; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2588 case Op_de: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2589 #ifndef TARGET_80387 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2590 #define XFmode TFmode |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2591 #endif |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2592 mode = XFmode; // not TFmode |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2593 // drop through |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2594 do_float: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2595 if (token->value == TOKfloat32v || token->value == TOKfloat64v || |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2596 token->value == TOKfloat80v) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2597 long words[3]; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2598 real_to_target(words, & token->float80value.rv(), mode); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2599 // don't use directives..., just use .long like GCC |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2600 insnTemplate->printf(".long\t%u", words[0]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2601 if (mode != SFmode) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2602 insnTemplate->printf(",%u", words[1]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2603 // DMD outputs 10 bytes, so we need to switch to .short here |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2604 if (mode == XFmode) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2605 insnTemplate->printf("\n\t.short\t%u", words[2]); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2606 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2607 stmt->error("expected float constant"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2608 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2609 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2610 default: |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2611 abort(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2612 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2613 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2614 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2615 if (token->value == TOKcomma) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2616 insnTemplate->writebyte(','); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2617 nextToken(); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2618 } else if (token->value == TOKeof) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2619 break; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2620 } else { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2621 stmt->error("expected comma"); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2622 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2623 } while (1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2624 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2625 setAsmCode();*/ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2626 } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2627 }; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2628 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2629 #if D_GCC_VER < 40 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2630 // struct rtx was modified for c++; this macro from rtl.h needs to |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2631 // be modified accordingly. |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2632 #undef XEXP |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2633 #define XEXP(RTX, N) (RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2634 #endif |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2635 |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2636 // FIXME |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2637 #define HOST_WIDE_INT long |
229
cac3d27ae481
[svn r245] initial support for labels in inline asm, broken :/
lindquist
parents:
227
diff
changeset
|
2638 bool getFrameRelativeValue(LLValue* decl, HOST_WIDE_INT * result) |
219
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2639 { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2640 // FIXME |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2641 // // Using this instead of DECL_RTL for struct args seems like a |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2642 // // good way to get hit by a truck because it may not agree with |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2643 // // non-asm access, but asm code wouldn't know what GCC does anyway. */ |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2644 // rtx r = DECL_INCOMING_RTL(decl); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2645 // rtx e1, e2; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2646 // |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2647 // // Local variables don't have DECL_INCOMING_RTL |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2648 // if (r == NULL_RTX) |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2649 // r = DECL_RTL(decl); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2650 // |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2651 // if (r != NULL_RTX && GET_CODE(r) == MEM /* && r->frame_related */ ) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2652 // r = XEXP(r, 0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2653 // if (GET_CODE(r) == PLUS) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2654 // e1 = XEXP(r, 0); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2655 // e2 = XEXP(r, 1); |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2656 // if (e1 == virtual_incoming_args_rtx && GET_CODE(e2) == CONST_INT) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2657 // *result = INTVAL(e2) + 8; // %% 8 is 32-bit specific... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2658 // return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2659 // } else if (e1 == virtual_stack_vars_rtx && GET_CODE(e2) == CONST_INT) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2660 // *result = INTVAL(e2); // %% 8 is 32-bit specific... |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2661 // return true; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2662 // } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2663 // } else if (r == virtual_incoming_args_rtx) { |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2664 // *result = 8; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2665 // return true; // %% same as above |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2666 // } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2667 // // shouldn't have virtual_stack_vars_rtx by itself |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2668 // } |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2669 // |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2670 return false; |
761c8352f494
[svn r235] rough port of GDC's inline assembler code, unfinished
ChristianK
parents:
diff
changeset
|
2671 } |