1 // Inferno utils/5l/optab.c
2 // http://code.google.com/p/inferno-os/source/browse/utils/5l/optab.c
3 //
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
6 // Portions Copyright © 1997-1999 Vita Nuova Limited
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
8 // Portions Copyright © 2004,2006 Bruce Ellis
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
11 // Portions Copyright © 2009 The Go Authors. All rights reserved.
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a copy
14 // of this software and associated documentation files (the "Software"), to deal
15 // in the Software without restriction, including without limitation the rights
16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 // copies of the Software, and to permit persons to whom the Software is
18 // furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included in
21 // all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 // THE SOFTWARE.
30
31 #include "l.h"
32
33 Optab optab[] =
34 {
35 /* struct Optab:
36 OPCODE, from, prog->reg, to, type,size,param,flag */
37 { ATEXT, C_ADDR, C_NONE, C_LCON, 0, 0, 0 },
38 { ATEXT, C_ADDR, C_REG, C_LCON, 0, 0, 0 },
39
40 { AADD, C_REG, C_REG, C_REG, 1, 4, 0 },
41 { AADD, C_REG, C_NONE, C_REG, 1, 4, 0 },
42 { AMOVW, C_REG, C_NONE, C_REG, 1, 4, 0 },
43 { AMVN, C_REG, C_NONE, C_REG, 1, 4, 0 },
44 { ACMP, C_REG, C_REG, C_NONE, 1, 4, 0 },
45
46 { AADD, C_RCON, C_REG, C_REG, 2, 4, 0 },
47 { AADD, C_RCON, C_NONE, C_REG, 2, 4, 0 },
48 { AMOVW, C_RCON, C_NONE, C_REG, 2, 4, 0 },
49 { AMVN, C_RCON, C_NONE, C_REG, 2, 4, 0 },
50 { ACMP, C_RCON, C_REG, C_NONE, 2, 4, 0 },
51
52 { AADD, C_SHIFT,C_REG, C_REG, 3, 4, 0 },
53 { AADD, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
54 { AMVN, C_SHIFT,C_NONE, C_REG, 3, 4, 0 },
55 { ACMP, C_SHIFT,C_REG, C_NONE, 3, 4, 0 },
56
57 { AMOVW, C_RACON,C_NONE, C_REG, 4, 4, REGSP },
58
59 { AB, C_NONE, C_NONE, C_SBRA, 5, 4, 0, LPOOL },
60 { ABL, C_NONE, C_NONE, C_SBRA, 5, 4, 0 },
61 { ABX, C_NONE, C_NONE, C_SBRA, 74, 20, 0 },
62 { ABEQ, C_NONE, C_NONE, C_SBRA, 5, 4, 0 },
63
64 { AB, C_NONE, C_NONE, C_ROREG, 6, 4, 0, LPOOL },
65 { ABL, C_NONE, C_NONE, C_ROREG, 7, 8, 0 },
66 { ABX, C_NONE, C_NONE, C_ROREG, 75, 12, 0 },
67 { ABXRET, C_NONE, C_NONE, C_ROREG, 76, 4, 0 },
68
69 { ASLL, C_RCON, C_REG, C_REG, 8, 4, 0 },
70 { ASLL, C_RCON, C_NONE, C_REG, 8, 4, 0 },
71
72 { ASLL, C_REG, C_NONE, C_REG, 9, 4, 0 },
73 { ASLL, C_REG, C_REG, C_REG, 9, 4, 0 },
74
75 { ASWI, C_NONE, C_NONE, C_NONE, 10, 4, 0 },
76 { ASWI, C_NONE, C_NONE, C_LOREG, 10, 4, 0 },
77 { ASWI, C_NONE, C_NONE, C_LCON, 10, 4, 0 },
78
79 { AWORD, C_NONE, C_NONE, C_LCON, 11, 4, 0 },
80 { AWORD, C_NONE, C_NONE, C_ADDR, 11, 4, 0 },
81
82 { AMOVW, C_NCON, C_NONE, C_REG, 12, 4, 0 },
83 { AMOVW, C_LCON, C_NONE, C_REG, 12, 4, 0, LFROM },
84
85 { AADD, C_NCON, C_REG, C_REG, 13, 8, 0 },
86 { AADD, C_NCON, C_NONE, C_REG, 13, 8, 0 },
87 { AMVN, C_NCON, C_NONE, C_REG, 13, 8, 0 },
88 { ACMP, C_NCON, C_REG, C_NONE, 13, 8, 0 },
89 { AADD, C_LCON, C_REG, C_REG, 13, 8, 0, LFROM },
90 { AADD, C_LCON, C_NONE, C_REG, 13, 8, 0, LFROM },
91 { AMVN, C_LCON, C_NONE, C_REG, 13, 8, 0, LFROM },
92 { ACMP, C_LCON, C_REG, C_NONE, 13, 8, 0, LFROM },
93
94 { AMOVB, C_REG, C_NONE, C_REG, 14, 8, 0 },
95 { AMOVBU, C_REG, C_NONE, C_REG, 58, 4, 0 },
96 { AMOVH, C_REG, C_NONE, C_REG, 14, 8, 0 },
97 { AMOVHU, C_REG, C_NONE, C_REG, 14, 8, 0 },
98
99 { AMUL, C_REG, C_REG, C_REG, 15, 4, 0 },
100 { AMUL, C_REG, C_NONE, C_REG, 15, 4, 0 },
101
102 { ADIV, C_REG, C_REG, C_REG, 16, 4, 0 },
103 { ADIV, C_REG, C_NONE, C_REG, 16, 4, 0 },
104
105 { AMULL, C_REG, C_REG, C_REGREG, 17, 4, 0 },
106
107 { AMOVW, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
108 { AMOVW, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
109 { AMOVB, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
110 { AMOVB, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
111 { AMOVBU, C_REG, C_NONE, C_SAUTO, 20, 4, REGSP },
112 { AMOVBU, C_REG, C_NONE, C_SOREG, 20, 4, 0 },
113
114 { AMOVW, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP },
115 { AMOVW, C_SOREG,C_NONE, C_REG, 21, 4, 0 },
116 { AMOVBU, C_SAUTO,C_NONE, C_REG, 21, 4, REGSP },
117 { AMOVBU, C_SOREG,C_NONE, C_REG, 21, 4, 0 },
118
119 { AMOVW, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
120 { AMOVW, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
121 { AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
122 { AMOVB, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
123 { AMOVB, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
124 { AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
125 { AMOVBU, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO },
126 { AMOVBU, C_REG, C_NONE, C_LOREG, 30, 8, 0, LTO },
127 { AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO },
128
129 { AMOVW, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM },
130 { AMOVW, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM },
131 { AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM },
132 { AMOVBU, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP, LFROM },
133 { AMOVBU, C_LOREG,C_NONE, C_REG, 31, 8, 0, LFROM },
134 { AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM },
135
136 { AMOVW, C_LACON,C_NONE, C_REG, 34, 8, REGSP, LFROM },
137
138 { AMOVW, C_PSR, C_NONE, C_REG, 35, 4, 0 },
139 { AMOVW, C_REG, C_NONE, C_PSR, 36, 4, 0 },
140 { AMOVW, C_RCON, C_NONE, C_PSR, 37, 4, 0 },
141
142 { AMOVM, C_LCON, C_NONE, C_SOREG, 38, 4, 0 },
143 { AMOVM, C_SOREG,C_NONE, C_LCON, 39, 4, 0 },
144
145 { ASWPW, C_SOREG,C_REG, C_REG, 40, 4, 0 },
146
147 { ARFE, C_NONE, C_NONE, C_NONE, 41, 4, 0 },
148
149 { AMOVF, C_FREG, C_NONE, C_FAUTO, 50, 4, REGSP },
150 { AMOVF, C_FREG, C_NONE, C_FOREG, 50, 4, 0 },
151
152 { AMOVF, C_FAUTO,C_NONE, C_FREG, 51, 4, REGSP },
153 { AMOVF, C_FOREG,C_NONE, C_FREG, 51, 4, 0 },
154
155 { AMOVF, C_FREG, C_NONE, C_LAUTO, 52, 12, REGSP, LTO },
156 { AMOVF, C_FREG, C_NONE, C_LOREG, 52, 12, 0, LTO },
157
158 { AMOVF, C_LAUTO,C_NONE, C_FREG, 53, 12, REGSP, LFROM },
159 { AMOVF, C_LOREG,C_NONE, C_FREG, 53, 12, 0, LFROM },
160
161 { AMOVF, C_FREG, C_NONE, C_ADDR, 68, 8, 0, LTO },
162 { AMOVF, C_ADDR, C_NONE, C_FREG, 69, 8, 0, LFROM },
163
164 { AADDF, C_FREG, C_NONE, C_FREG, 54, 4, 0 },
165 { AADDF, C_FREG, C_REG, C_FREG, 54, 4, 0 },
166 { AMOVF, C_FREG, C_NONE, C_FREG, 54, 4, 0 },
167
168 { AMOVW, C_REG, C_NONE, C_FCR, 56, 4, 0 },
169 { AMOVW, C_FCR, C_NONE, C_REG, 57, 4, 0 },
170
171 { AMOVW, C_SHIFT,C_NONE, C_REG, 59, 4, 0 },
172 { AMOVBU, C_SHIFT,C_NONE, C_REG, 59, 4, 0 },
173
174 { AMOVB, C_SHIFT,C_NONE, C_REG, 60, 4, 0 },
175
176 { AMOVW, C_REG, C_NONE, C_SHIFT, 61, 4, 0 },
177 { AMOVB, C_REG, C_NONE, C_SHIFT, 61, 4, 0 },
178 { AMOVBU, C_REG, C_NONE, C_SHIFT, 61, 4, 0 },
179
180 { ACASE, C_REG, C_NONE, C_NONE, 62, 4, 0 },
181 { ABCASE, C_NONE, C_NONE, C_SBRA, 63, 4, 0 },
182
183 { AMOVH, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, 0 },
184 { AMOVH, C_REG, C_NONE, C_HOREG, 70, 4, 0, 0 },
185 { AMOVHU, C_REG, C_NONE, C_HAUTO, 70, 4, REGSP, 0 },
186 { AMOVHU, C_REG, C_NONE, C_HOREG, 70, 4, 0, 0 },
187
188 { AMOVB, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, 0 },
189 { AMOVB, C_HOREG,C_NONE, C_REG, 71, 4, 0, 0 },
190 { AMOVH, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, 0 },
191 { AMOVH, C_HOREG,C_NONE, C_REG, 71, 4, 0, 0 },
192 { AMOVHU, C_HAUTO,C_NONE, C_REG, 71, 4, REGSP, 0 },
193 { AMOVHU, C_HOREG,C_NONE, C_REG, 71, 4, 0, 0 },
194
195 { AMOVH, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO },
196 { AMOVH, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO },
197 { AMOVH, C_REG, C_NONE, C_ADDR, 94, 8, 0, LTO },
198 { AMOVHU, C_REG, C_NONE, C_LAUTO, 72, 8, REGSP, LTO },
199 { AMOVHU, C_REG, C_NONE, C_LOREG, 72, 8, 0, LTO },
200 { AMOVHU, C_REG, C_NONE, C_ADDR, 94, 8, 0, LTO },
201
202 { AMOVB, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM },
203 { AMOVB, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM },
204 { AMOVB, C_ADDR, C_NONE, C_REG, 93, 8, 0, LFROM },
205 { AMOVH, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM },
206 { AMOVH, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM },
207 { AMOVH, C_ADDR, C_NONE, C_REG, 93, 8, 0, LFROM },
208 { AMOVHU, C_LAUTO,C_NONE, C_REG, 73, 8, REGSP, LFROM },
209 { AMOVHU, C_LOREG,C_NONE, C_REG, 73, 8, 0, LFROM },
210 { AMOVHU, C_ADDR, C_NONE, C_REG, 93, 8, 0, LFROM },
211
212 { ALDREX, C_SOREG,C_NONE, C_REG, 77, 4, 0 },
213 { ASTREX, C_SOREG,C_REG, C_REG, 78, 4, 0 },
214
215 { AMOVF, C_ZFCON,C_NONE, C_FREG, 80, 8, 0 },
216 { AMOVF, C_SFCON,C_NONE, C_FREG, 81, 4, 0 },
217
218 { ACMPF, C_FREG, C_REG, C_NONE, 82, 8, 0 },
219 { ACMPF, C_FREG, C_NONE, C_NONE, 83, 8, 0 },
220
221 { AMOVFW, C_FREG, C_NONE, C_FREG, 84, 4, 0 },
222 { AMOVWF, C_FREG, C_NONE, C_FREG, 85, 4, 0 },
223
224 { AMOVFW, C_FREG, C_NONE, C_REG, 86, 8, 0 },
225 { AMOVWF, C_REG, C_NONE, C_FREG, 87, 8, 0 },
226
227 { AMOVW, C_REG, C_NONE, C_FREG, 88, 4, 0 },
228 { AMOVW, C_FREG, C_NONE, C_REG, 89, 4, 0 },
229
230 { ATST, C_REG, C_NONE, C_NONE, 90, 4, 0 },
231
232 { ALDREXD, C_SOREG,C_NONE, C_REG, 91, 4, 0 },
233 { ASTREXD, C_SOREG,C_REG, C_REG, 92, 4, 0 },
234
235 { AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
236 };