x87.isa revision 9894:c0a3920859bd
1// Copyright (c) 2007 The Hewlett-Packard Development Company
2// Copyright (c) 2012-13 Mark D. Hill and David A. Wood
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
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
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 {
56            0x0: decode MODRM_MOD {
57                0x3: Inst::FLD(Eq);
58                // 32-bit load
59                default: Inst::FLD(Md);
60            }
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: Inst::FST(Ed);
71            }
72            0x3: decode MODRM_MOD {
73                0x3: Inst::UD2();
74                default: Inst::FSTP(Ed);
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 {
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();
95                }
96                default: Inst::FLDCW(Mw);
97            }
98            0x6: decode MODRM_MOD {
99                0x3: decode MODRM_RM {
100                    0x0: f2xm1();
101                    0x1: Inst::FYL2X();
102                    0x2: Inst::FPTAN();
103                    0x3: fpatan();
104                    0x4: fxtract();
105                    0x5: Inst::FPREM1();
106                    0x6: fdecstp();
107                    0x7: fincstp();
108                }
109                default: fnstenv();
110            }
111            0x7: decode MODRM_MOD {
112                0x3: decode MODRM_RM {
113                    0x0: Inst::FPREM();
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
192                default: Inst::FLD80(M);
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: Inst::FST80P(M);
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
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}
342