x87.isa (9472:8a2175fa7fa0) x87.isa (9582:0632d2d1575c)
1// Copyright (c) 2007 The Hewlett-Packard Development Company
1// Copyright (c) 2007 The Hewlett-Packard Development Company
2// Copyright (c) 2012-13 Mark D. Hill and David A. Wood
2// All rights reserved.
3//
4// The license below extends only to copyright in the software and shall
5// not be construed as granting a license to any other intellectual
6// property including but not limited to intellectual property relating
7// to a hardware implementation of the functionality of the software
8// licensed hereunder. You may use the software subject to the license
9// terms below provided that you ensure that this notice is replicated
10// unmodified and in its entirety in all distributions of the software,
11// modified or unmodified, in source code or in binary form.
12//
13// Redistribution and use in source and binary forms, with or without
14// modification, are permitted provided that the following conditions are
15// met: redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer;
17// redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution;
20// neither the name of the copyright holders nor the names of its
21// contributors may be used to endorse or promote products derived from
22// this software without specific prior written permission.
23//
24// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35//
36// Authors: Gabe Black
3// All rights reserved.
4//
5// The license below extends only to copyright in the software and shall
6// not be construed as granting a license to any other intellectual
7// property including but not limited to intellectual property relating
8// to a hardware implementation of the functionality of the software
9// licensed hereunder. You may use the software subject to the license
10// terms below provided that you ensure that this notice is replicated
11// unmodified and in its entirety in all distributions of the software,
12// modified or unmodified, in source code or in binary form.
13//
14// Redistribution and use in source and binary forms, with or without
15// modification, are permitted provided that the following conditions are
16// met: redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer;
18// redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution;
21// neither the name of the copyright holders nor the names of its
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Authors: Gabe Black
38// Nilay Vaish
37
38format WarnUnimpl {
39 0x1B: decode OPCODE_OP_BOTTOM3 {
40 //0x0: esc0();
41 0x0: decode MODRM_REG {
39
40format WarnUnimpl {
41 0x1B: decode OPCODE_OP_BOTTOM3 {
42 //0x0: esc0();
43 0x0: decode MODRM_REG {
44 // ST(0) = ST(0) + 32-bit Mem
42 0x0: fadd();
43 0x1: fmul();
44 0x2: fcom();
45 0x3: fcomp();
46 0x4: fsub();
47 0x5: fsubr();
48 0x6: fdiv();
49 0x7: fdivr();
50 }
51 //0x1: esc1();
52 0x1: decode MODRM_REG {
45 0x0: fadd();
46 0x1: fmul();
47 0x2: fcom();
48 0x3: fcomp();
49 0x4: fsub();
50 0x5: fsubr();
51 0x6: fdiv();
52 0x7: fdivr();
53 }
54 //0x1: esc1();
55 0x1: decode MODRM_REG {
53 0x0: fld();
56 0x0: decode MODRM_MOD {
57 0x3: Inst::FLD(Eq);
58 // 32-bit load
59 default: Inst::FLD(Md);
60 }
54 0x1: decode MODRM_MOD {
55 0x3: fxch();
56 default: Inst::UD2();
57 }
58 0x2: decode MODRM_MOD {
59 0x3: decode MODRM_RM {
60 0x0: fnop();
61 default: Inst::UD2();
62 }
63 default: fst();
64 }
65 0x3: decode MODRM_MOD {
66 0x3: Inst::UD2();
67 default: fstp();
68 }
69 0x4: decode MODRM_MOD {
70 0x3: decode MODRM_RM {
71 0x0: Inst::FCHS();
72 0x1: Inst::FABS();
73 0x4: ftst();
74 0x5: fxam();
75 default: Inst::UD2();
76 }
77 default: fldenv();
78 }
79 0x5: decode MODRM_MOD {
80 0x3: decode MODRM_RM {
61 0x1: decode MODRM_MOD {
62 0x3: fxch();
63 default: Inst::UD2();
64 }
65 0x2: decode MODRM_MOD {
66 0x3: decode MODRM_RM {
67 0x0: fnop();
68 default: Inst::UD2();
69 }
70 default: fst();
71 }
72 0x3: decode MODRM_MOD {
73 0x3: Inst::UD2();
74 default: fstp();
75 }
76 0x4: decode MODRM_MOD {
77 0x3: decode MODRM_RM {
78 0x0: Inst::FCHS();
79 0x1: Inst::FABS();
80 0x4: ftst();
81 0x5: fxam();
82 default: Inst::UD2();
83 }
84 default: fldenv();
85 }
86 0x5: decode MODRM_MOD {
87 0x3: decode MODRM_RM {
81 0x0: fld1();
82 0x1: fldl2t();
83 0x2: fldl2e();
84 0x3: fldpi();
85 0x4: fldlg2();
86 0x5: fldln2();
87 0x6: fldz();
88 0x0: Inst::FLD1();
89 0x1: Inst::FLDL2T();
90 0x2: Inst::FLDL2E();
91 0x3: Inst::FLDPI();
92 0x4: Inst::FLDLG2();
93 0x5: Inst::FLDLN2();
94 0x6: Inst::FLDZ();
88 }
95 }
89 default: fldcw_Mw();
96 default: Inst::FLDCW(Mw);
90 }
91 0x6: decode MODRM_MOD {
92 0x3: decode MODRM_RM {
93 0x0: f2xm1();
97 }
98 0x6: decode MODRM_MOD {
99 0x3: decode MODRM_RM {
100 0x0: f2xm1();
94 0x1: fyl2x();
95 0x2: fptan();
101 0x1: Inst::FYL2X();
102 0x2: Inst::FPTAN();
96 0x3: fpatan();
97 0x4: fxtract();
103 0x3: fpatan();
104 0x4: fxtract();
98 0x5: fprem1();
105 0x5: Inst::FPREM1();
99 0x6: fdecstp();
100 0x7: fincstp();
101 }
102 default: fnstenv();
103 }
104 0x7: decode MODRM_MOD {
105 0x3: decode MODRM_RM {
106 0x6: fdecstp();
107 0x7: fincstp();
108 }
109 default: fnstenv();
110 }
111 0x7: decode MODRM_MOD {
112 0x3: decode MODRM_RM {
106 0x0: fprem();
113 0x0: Inst::FPREM();
107 0x1: fyl2xp1();
108 0x2: fsqrt();
109 0x3: Inst::FSINCOS();
110 0x4: frndint();
111 0x5: fscale();
112 0x6: Inst::FSIN();
113 0x7: Inst::FCOS();
114 }
115 default: Inst::FNSTCW(Mw);
116 }
117 }
118 //0x2: esc2();
119 0x2: decode MODRM_REG {
120 0x0: decode MODRM_MOD {
121 0x3: fcmovb();
122 default: fiadd();
123 }
124 0x1: decode MODRM_MOD {
125 0x3: fcmove();
126 default: fimul();
127 }
128 0x2: decode MODRM_MOD {
129 0x3: fcmovbe();
130 default: ficom();
131 }
132 0x3: decode MODRM_MOD {
133 0x3: fcmovu();
134 default: ficomp();
135 }
136 0x4: decode MODRM_MOD {
137 0x3: Inst::UD2();
138 default: fisub();
139 }
140 0x5: decode MODRM_MOD {
141 0x3: decode MODRM_RM {
142 0x1: fucompp();
143 default: Inst::UD2();
144 }
145 default: fisubr();
146 }
147 0x6: decode MODRM_MOD {
148 0x3: Inst::UD2();
149 default: fidiv();
150 }
151 0x7: decode MODRM_MOD {
152 0x3: Inst::UD2();
153 default: fidivr();
154 }
155 }
156 //0x3: esc3();
157 0x3: decode MODRM_REG {
158 0x0: decode MODRM_MOD {
159 0x3: fcmovnb();
160 default: fild();
161 }
162 0x1: decode MODRM_MOD {
163 0x3: fcmovne();
164 default: fisttp();
165 }
166 0x2: decode MODRM_MOD {
167 0x3: fcmovnbe();
168 default: fist();
169 }
170 0x3: decode MODRM_MOD {
171 0x3: fcmovnu();
172 default: fistp();
173 }
174 0x4: decode MODRM_MOD {
175 0x3: decode MODRM_RM {
176 0x2: fnclex();
177 0x3: fninit();
178 default: Inst::UD2();
179 }
180 default: Inst::UD2();
181 }
182 0x5: decode MODRM_MOD {
183 0x3: fucomi();
114 0x1: fyl2xp1();
115 0x2: fsqrt();
116 0x3: Inst::FSINCOS();
117 0x4: frndint();
118 0x5: fscale();
119 0x6: Inst::FSIN();
120 0x7: Inst::FCOS();
121 }
122 default: Inst::FNSTCW(Mw);
123 }
124 }
125 //0x2: esc2();
126 0x2: decode MODRM_REG {
127 0x0: decode MODRM_MOD {
128 0x3: fcmovb();
129 default: fiadd();
130 }
131 0x1: decode MODRM_MOD {
132 0x3: fcmove();
133 default: fimul();
134 }
135 0x2: decode MODRM_MOD {
136 0x3: fcmovbe();
137 default: ficom();
138 }
139 0x3: decode MODRM_MOD {
140 0x3: fcmovu();
141 default: ficomp();
142 }
143 0x4: decode MODRM_MOD {
144 0x3: Inst::UD2();
145 default: fisub();
146 }
147 0x5: decode MODRM_MOD {
148 0x3: decode MODRM_RM {
149 0x1: fucompp();
150 default: Inst::UD2();
151 }
152 default: fisubr();
153 }
154 0x6: decode MODRM_MOD {
155 0x3: Inst::UD2();
156 default: fidiv();
157 }
158 0x7: decode MODRM_MOD {
159 0x3: Inst::UD2();
160 default: fidivr();
161 }
162 }
163 //0x3: esc3();
164 0x3: decode MODRM_REG {
165 0x0: decode MODRM_MOD {
166 0x3: fcmovnb();
167 default: fild();
168 }
169 0x1: decode MODRM_MOD {
170 0x3: fcmovne();
171 default: fisttp();
172 }
173 0x2: decode MODRM_MOD {
174 0x3: fcmovnbe();
175 default: fist();
176 }
177 0x3: decode MODRM_MOD {
178 0x3: fcmovnu();
179 default: fistp();
180 }
181 0x4: decode MODRM_MOD {
182 0x3: decode MODRM_RM {
183 0x2: fnclex();
184 0x3: fninit();
185 default: Inst::UD2();
186 }
187 default: Inst::UD2();
188 }
189 0x5: decode MODRM_MOD {
190 0x3: fucomi();
191 // 80-bit load
184 default: fld();
185 }
186 0x6: decode MODRM_MOD {
187 0x3: fcomi();
188 default: Inst::UD2();
189 }
190 0x7: decode MODRM_MOD {
191 0x3: Inst::UD2();
192 default: fstp();
193 }
194 }
195 //0x4: esc4();
196 0x4: decode MODRM_REG {
197 0x0: fadd();
198 0x1: fmul();
199 0x2: decode MODRM_MOD {
200 0x3: Inst::UD2();
201 default: fcom();
202 }
203 0x3: decode MODRM_MOD {
204 0x3: Inst::UD2();
205 default: fcomp();
206 }
207 0x4: decode MODRM_MOD {
208 0x3: fsubr();
209 default: fsub();
210 }
211 0x5: decode MODRM_MOD {
212 0x3: fsub();
213 default: fsubr();
214 }
215 0x6: decode MODRM_MOD {
216 0x3: fdivr();
217 default: fdiv();
218 }
219 0x7: decode MODRM_MOD {
220 0x3: fdiv();
221 default: fdivr();
222 }
223 }
224 //0x5: esc5();
225 0x5: decode MODRM_REG {
226 0x0: decode MODRM_MOD {
227 0x3: ffree();
192 default: fld();
193 }
194 0x6: decode MODRM_MOD {
195 0x3: fcomi();
196 default: Inst::UD2();
197 }
198 0x7: decode MODRM_MOD {
199 0x3: Inst::UD2();
200 default: fstp();
201 }
202 }
203 //0x4: esc4();
204 0x4: decode MODRM_REG {
205 0x0: fadd();
206 0x1: fmul();
207 0x2: decode MODRM_MOD {
208 0x3: Inst::UD2();
209 default: fcom();
210 }
211 0x3: decode MODRM_MOD {
212 0x3: Inst::UD2();
213 default: fcomp();
214 }
215 0x4: decode MODRM_MOD {
216 0x3: fsubr();
217 default: fsub();
218 }
219 0x5: decode MODRM_MOD {
220 0x3: fsub();
221 default: fsubr();
222 }
223 0x6: decode MODRM_MOD {
224 0x3: fdivr();
225 default: fdiv();
226 }
227 0x7: decode MODRM_MOD {
228 0x3: fdiv();
229 default: fdivr();
230 }
231 }
232 //0x5: esc5();
233 0x5: decode MODRM_REG {
234 0x0: decode MODRM_MOD {
235 0x3: ffree();
236 // 64-bit load
228 default: Inst::FLD(Mq);
229 }
230 0x1: decode MODRM_MOD {
231 0x3: Inst::UD2();
232 default: fisttp();
233 }
234 0x2: Inst::FST(Eq);
235 0x3: Inst::FSTP(Eq);
236 0x4: decode MODRM_MOD {
237 0x3: fucom();
238 default: frstor();
239 }
240 0x5: decode MODRM_MOD {
241 0x3: fucomp();
242 default: Inst::UD2();
243 }
244 0x6: decode MODRM_MOD {
245 0x3: Inst::UD2();
246 default: fnsave();
247 }
248 0x7: decode MODRM_MOD {
249 0x3: Inst::UD2();
250 default: Inst::FNSTSW(Mw);
251 }
252 }
253 //0x6: esc6();
254 0x6: decode MODRM_REG {
255 0x0: decode MODRM_MOD {
256 0x3: faddp();
257 default: fiadd();
258 }
259 0x1: decode MODRM_MOD {
260 0x3: fmulp();
261 default: fimul();
262 }
263 0x2: decode MODRM_MOD {
264 0x3: Inst::UD2();
265 default: ficom();
266 }
267 0x3: decode MODRM_MOD {
268 0x3: decode MODRM_RM {
269 0x1: fcompp();
270 default: Inst::UD2();
271 }
272 default: ficomp();
273 }
274 0x4: decode MODRM_MOD {
275 0x3: fsubrp();
276 default: fisub();
277 }
278 0x5: decode MODRM_MOD {
279 0x3: fsubp();
280 default: fisubr();
281 }
282 0x6: decode MODRM_MOD {
283 0x3: fdivrp();
284 default: fidiv();
285 }
286 0x7: decode MODRM_MOD {
287 0x3: fdivp();
288 default: fidivr();
289 }
290 }
291 //0x7: esc7();
292 0x7: decode MODRM_REG {
293 0x0: decode MODRM_MOD {
294 // The ffreep instruction isn't entirely real. It should work
295 // the same as ffree but then also pop the register stack.
296 0x3: ffreep();
297 default: fild();
298 }
299 0x1: decode MODRM_MOD {
300 0x3: Inst::UD2();
301 default: fisttp();
302 }
303 0x2: decode MODRM_MOD {
304 0x3: Inst::UD2();
305 default: fist();
306 }
307 0x3: decode MODRM_MOD {
308 0x3: Inst::UD2();
309 default: fistp();
310 }
311 0x4: decode MODRM_MOD {
312 0x3: decode MODRM_RM {
313 0x0: Inst::FNSTSW(rAw);
314 default: Inst::UD2();
315 }
316 default: fbld();
317 }
318 0x5: decode MODRM_MOD {
319 0x3: fucomip();
320 default: fild();
321 }
322 0x6: decode MODRM_MOD {
323 0x3: fcomip();
324 default: fbstp();
325 }
326 0x7: decode MODRM_MOD {
327 0x3: Inst::UD2();
328 default: fistp();
329 }
330 }
331 }
332}
237 default: Inst::FLD(Mq);
238 }
239 0x1: decode MODRM_MOD {
240 0x3: Inst::UD2();
241 default: fisttp();
242 }
243 0x2: Inst::FST(Eq);
244 0x3: Inst::FSTP(Eq);
245 0x4: decode MODRM_MOD {
246 0x3: fucom();
247 default: frstor();
248 }
249 0x5: decode MODRM_MOD {
250 0x3: fucomp();
251 default: Inst::UD2();
252 }
253 0x6: decode MODRM_MOD {
254 0x3: Inst::UD2();
255 default: fnsave();
256 }
257 0x7: decode MODRM_MOD {
258 0x3: Inst::UD2();
259 default: Inst::FNSTSW(Mw);
260 }
261 }
262 //0x6: esc6();
263 0x6: decode MODRM_REG {
264 0x0: decode MODRM_MOD {
265 0x3: faddp();
266 default: fiadd();
267 }
268 0x1: decode MODRM_MOD {
269 0x3: fmulp();
270 default: fimul();
271 }
272 0x2: decode MODRM_MOD {
273 0x3: Inst::UD2();
274 default: ficom();
275 }
276 0x3: decode MODRM_MOD {
277 0x3: decode MODRM_RM {
278 0x1: fcompp();
279 default: Inst::UD2();
280 }
281 default: ficomp();
282 }
283 0x4: decode MODRM_MOD {
284 0x3: fsubrp();
285 default: fisub();
286 }
287 0x5: decode MODRM_MOD {
288 0x3: fsubp();
289 default: fisubr();
290 }
291 0x6: decode MODRM_MOD {
292 0x3: fdivrp();
293 default: fidiv();
294 }
295 0x7: decode MODRM_MOD {
296 0x3: fdivp();
297 default: fidivr();
298 }
299 }
300 //0x7: esc7();
301 0x7: decode MODRM_REG {
302 0x0: decode MODRM_MOD {
303 // The ffreep instruction isn't entirely real. It should work
304 // the same as ffree but then also pop the register stack.
305 0x3: ffreep();
306 default: fild();
307 }
308 0x1: decode MODRM_MOD {
309 0x3: Inst::UD2();
310 default: fisttp();
311 }
312 0x2: decode MODRM_MOD {
313 0x3: Inst::UD2();
314 default: fist();
315 }
316 0x3: decode MODRM_MOD {
317 0x3: Inst::UD2();
318 default: fistp();
319 }
320 0x4: decode MODRM_MOD {
321 0x3: decode MODRM_RM {
322 0x0: Inst::FNSTSW(rAw);
323 default: Inst::UD2();
324 }
325 default: fbld();
326 }
327 0x5: decode MODRM_MOD {
328 0x3: fucomip();
329 default: fild();
330 }
331 0x6: decode MODRM_MOD {
332 0x3: fcomip();
333 default: fbstp();
334 }
335 0x7: decode MODRM_MOD {
336 0x3: Inst::UD2();
337 default: fistp();
338 }
339 }
340 }
341}