x87.isa revision 8106
14825Sgblack@eecs.umich.edu// Copyright (c) 2007 The Hewlett-Packard Development Company
24825Sgblack@eecs.umich.edu// All rights reserved.
34825Sgblack@eecs.umich.edu//
47087Snate@binkert.org// The license below extends only to copyright in the software and shall
57087Snate@binkert.org// not be construed as granting a license to any other intellectual
67087Snate@binkert.org// property including but not limited to intellectual property relating
77087Snate@binkert.org// to a hardware implementation of the functionality of the software
87087Snate@binkert.org// licensed hereunder.  You may use the software subject to the license
97087Snate@binkert.org// terms below provided that you ensure that this notice is replicated
107087Snate@binkert.org// unmodified and in its entirety in all distributions of the software,
117087Snate@binkert.org// modified or unmodified, in source code or in binary form.
124825Sgblack@eecs.umich.edu//
137087Snate@binkert.org// Redistribution and use in source and binary forms, with or without
147087Snate@binkert.org// modification, are permitted provided that the following conditions are
157087Snate@binkert.org// met: redistributions of source code must retain the above copyright
167087Snate@binkert.org// notice, this list of conditions and the following disclaimer;
177087Snate@binkert.org// redistributions in binary form must reproduce the above copyright
187087Snate@binkert.org// notice, this list of conditions and the following disclaimer in the
197087Snate@binkert.org// documentation and/or other materials provided with the distribution;
207087Snate@binkert.org// neither the name of the copyright holders nor the names of its
214825Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
227087Snate@binkert.org// this software without specific prior written permission.
234825Sgblack@eecs.umich.edu//
244825Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
254825Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
264825Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
274825Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
284825Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
294825Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
304825Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
314825Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
324825Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
334825Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
344825Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
354825Sgblack@eecs.umich.edu//
364825Sgblack@eecs.umich.edu// Authors: Gabe Black
374825Sgblack@eecs.umich.edu
385162Sgblack@eecs.umich.eduformat WarnUnimpl {
395162Sgblack@eecs.umich.edu    0x1B: decode OPCODE_OP_BOTTOM3 {
405162Sgblack@eecs.umich.edu        //0x0: esc0();
415162Sgblack@eecs.umich.edu        0x0: decode MODRM_REG {
425162Sgblack@eecs.umich.edu            0x0: fadd();
435162Sgblack@eecs.umich.edu            0x1: fmul();
445162Sgblack@eecs.umich.edu            0x2: fcom();
455162Sgblack@eecs.umich.edu            0x3: fcomp();
465162Sgblack@eecs.umich.edu            0x4: fsub();
475162Sgblack@eecs.umich.edu            0x5: fsubr();
485162Sgblack@eecs.umich.edu            0x6: fdiv();
495162Sgblack@eecs.umich.edu            0x7: fdivr();
504825Sgblack@eecs.umich.edu        }
515162Sgblack@eecs.umich.edu        //0x1: esc1();
525162Sgblack@eecs.umich.edu        0x1: decode MODRM_REG {
535162Sgblack@eecs.umich.edu            0x0: fld();
545162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
555162Sgblack@eecs.umich.edu                0x3: fxch();
564825Sgblack@eecs.umich.edu                default: Inst::UD2();
574825Sgblack@eecs.umich.edu            }
585162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
595162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
605162Sgblack@eecs.umich.edu                    0x0: fnop();
615162Sgblack@eecs.umich.edu                    default: Inst::UD2();
625162Sgblack@eecs.umich.edu                }
635162Sgblack@eecs.umich.edu                default: fst();
645162Sgblack@eecs.umich.edu            }
655162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
665162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
675162Sgblack@eecs.umich.edu                default: fstp();
685162Sgblack@eecs.umich.edu            }
695162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
705162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
715162Sgblack@eecs.umich.edu                    0x0: fchs();
725162Sgblack@eecs.umich.edu                    0x1: fabs();
735162Sgblack@eecs.umich.edu                    0x4: ftst();
745162Sgblack@eecs.umich.edu                    0x5: fxam();
755162Sgblack@eecs.umich.edu                    default: Inst::UD2();
765162Sgblack@eecs.umich.edu                }
775162Sgblack@eecs.umich.edu                default: fldenv();
785162Sgblack@eecs.umich.edu            }
795162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
805162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
815162Sgblack@eecs.umich.edu                    0x0: fld1();
825162Sgblack@eecs.umich.edu                    0x1: fldl2t();
835162Sgblack@eecs.umich.edu                    0x2: fldl2e();
845162Sgblack@eecs.umich.edu                    0x3: fldpi();
855162Sgblack@eecs.umich.edu                    0x4: fldlg2();
865162Sgblack@eecs.umich.edu                    0x5: fldln2();
875162Sgblack@eecs.umich.edu                    0x6: fldz();
885162Sgblack@eecs.umich.edu                }
895162Sgblack@eecs.umich.edu                default: fldcw_Mw();
905162Sgblack@eecs.umich.edu            }
915162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
925162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
935162Sgblack@eecs.umich.edu                    0x0: f2xm1();
945162Sgblack@eecs.umich.edu                    0x1: fyl2x();
955162Sgblack@eecs.umich.edu                    0x2: fptan();
965162Sgblack@eecs.umich.edu                    0x3: fpatan();
975162Sgblack@eecs.umich.edu                    0x4: fxtract();
985162Sgblack@eecs.umich.edu                    0x5: fprem1();
995162Sgblack@eecs.umich.edu                    0x6: fdecstp();
1005162Sgblack@eecs.umich.edu                    0x7: fincstp();
1015162Sgblack@eecs.umich.edu                }
1025162Sgblack@eecs.umich.edu                default: fnstenv();
1035162Sgblack@eecs.umich.edu            }
1045162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
1055162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
1065162Sgblack@eecs.umich.edu                    0x0: fprem();
1075162Sgblack@eecs.umich.edu                    0x1: fyl2xp1();
1085162Sgblack@eecs.umich.edu                    0x2: fsqrt();
1095162Sgblack@eecs.umich.edu                    0x3: fsincos();
1105162Sgblack@eecs.umich.edu                    0x4: frndint();
1115162Sgblack@eecs.umich.edu                    0x5: fscale();
1125162Sgblack@eecs.umich.edu                    0x6: fsin();
1135162Sgblack@eecs.umich.edu                    0x7: fcos();
1145162Sgblack@eecs.umich.edu                }
1155162Sgblack@eecs.umich.edu                default: fnstcw_Mw();
1165162Sgblack@eecs.umich.edu            }
1174825Sgblack@eecs.umich.edu        }
1185162Sgblack@eecs.umich.edu        //0x2: esc2();
1195162Sgblack@eecs.umich.edu        0x2: decode MODRM_REG {
1205162Sgblack@eecs.umich.edu            0x0: decode MODRM_MOD {
1215162Sgblack@eecs.umich.edu                0x3: fcmovb();
1225162Sgblack@eecs.umich.edu                default: fiadd();
1235162Sgblack@eecs.umich.edu            }
1245162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
1255162Sgblack@eecs.umich.edu                0x3: fcmove();
1265162Sgblack@eecs.umich.edu                default: fimul();
1275162Sgblack@eecs.umich.edu            }
1285162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
1295162Sgblack@eecs.umich.edu                0x3: fcmovbe();
1305162Sgblack@eecs.umich.edu                default: ficom();
1315162Sgblack@eecs.umich.edu            }
1325162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
1335162Sgblack@eecs.umich.edu                0x3: fcmovu();
1345162Sgblack@eecs.umich.edu                default: ficomp();
1355162Sgblack@eecs.umich.edu            }
1365162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
1375162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
1385162Sgblack@eecs.umich.edu                default: fisub();
1395162Sgblack@eecs.umich.edu            }
1405162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
1415162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
1425162Sgblack@eecs.umich.edu                    0x1: fucompp();
1435162Sgblack@eecs.umich.edu                    default: Inst::UD2();
1445162Sgblack@eecs.umich.edu                }
1455162Sgblack@eecs.umich.edu                default: fisubr();
1465162Sgblack@eecs.umich.edu            }
1475162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
1485162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
1495162Sgblack@eecs.umich.edu                default: fidiv();
1505162Sgblack@eecs.umich.edu            }
1515162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
1525162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
1535162Sgblack@eecs.umich.edu                default: fidivr();
1545162Sgblack@eecs.umich.edu            }
1554825Sgblack@eecs.umich.edu        }
1565162Sgblack@eecs.umich.edu        //0x3: esc3();
1575162Sgblack@eecs.umich.edu        0x3: decode MODRM_REG {
1585162Sgblack@eecs.umich.edu            0x0: decode MODRM_MOD {
1595162Sgblack@eecs.umich.edu                0x3: fcmovnb();
1605162Sgblack@eecs.umich.edu                default: fild();
1615162Sgblack@eecs.umich.edu            }
1625162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
1635162Sgblack@eecs.umich.edu                0x3: fcmovne();
1645162Sgblack@eecs.umich.edu                default: fisttp();
1655162Sgblack@eecs.umich.edu            }
1665162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
1675162Sgblack@eecs.umich.edu                0x3: fcmovnbe();
1685162Sgblack@eecs.umich.edu                default: fist();
1695162Sgblack@eecs.umich.edu            }
1705162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
1715162Sgblack@eecs.umich.edu                0x3: fcmovnu();
1725162Sgblack@eecs.umich.edu                default: fistp();
1735162Sgblack@eecs.umich.edu            }
1745162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
1755162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
1765162Sgblack@eecs.umich.edu                    0x2: fnclex();
1775162Sgblack@eecs.umich.edu                    0x3: fninit();
1785162Sgblack@eecs.umich.edu                    default: Inst::UD2();
1795162Sgblack@eecs.umich.edu                }
1804825Sgblack@eecs.umich.edu                default: Inst::UD2();
1814825Sgblack@eecs.umich.edu            }
1825162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
1835162Sgblack@eecs.umich.edu                0x3: fucomi();
1845162Sgblack@eecs.umich.edu                default: fld();
1854825Sgblack@eecs.umich.edu            }
1865162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
1875162Sgblack@eecs.umich.edu                0x3: fcomi();
1884825Sgblack@eecs.umich.edu                default: Inst::UD2();
1894825Sgblack@eecs.umich.edu            }
1905162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
1915162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
1925162Sgblack@eecs.umich.edu                default: fstp();
1935162Sgblack@eecs.umich.edu            }
1944825Sgblack@eecs.umich.edu        }
1955162Sgblack@eecs.umich.edu        //0x4: esc4();
1965162Sgblack@eecs.umich.edu        0x4: decode MODRM_REG {
1975162Sgblack@eecs.umich.edu            0x0: fadd();
1985162Sgblack@eecs.umich.edu            0x1: fmul();
1995162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
2005162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2015162Sgblack@eecs.umich.edu                default: fcom();
2025162Sgblack@eecs.umich.edu            }
2035162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
2045162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2055162Sgblack@eecs.umich.edu                default: fcomp();
2065162Sgblack@eecs.umich.edu            }
2075162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
2085162Sgblack@eecs.umich.edu                0x3: fsubr();
2095162Sgblack@eecs.umich.edu                default: fsub();
2105162Sgblack@eecs.umich.edu            }
2115162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
2125162Sgblack@eecs.umich.edu                0x3: fsub();
2135162Sgblack@eecs.umich.edu                default: fsubr();
2145162Sgblack@eecs.umich.edu            }
2155162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
2165162Sgblack@eecs.umich.edu                0x3: fdivr();
2175162Sgblack@eecs.umich.edu                default: fdiv();
2185162Sgblack@eecs.umich.edu            }
2195162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
2205162Sgblack@eecs.umich.edu                0x3: fdiv();
2215162Sgblack@eecs.umich.edu                default: fdivr();
2225162Sgblack@eecs.umich.edu            }
2234825Sgblack@eecs.umich.edu        }
2245162Sgblack@eecs.umich.edu        //0x5: esc5();
2255162Sgblack@eecs.umich.edu        0x5: decode MODRM_REG {
2265162Sgblack@eecs.umich.edu            0x0: decode MODRM_MOD {
2275162Sgblack@eecs.umich.edu                0x3: ffree();
2285162Sgblack@eecs.umich.edu                default: Inst::FLD(Mq);
2295162Sgblack@eecs.umich.edu            }
2305162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
2315162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2325162Sgblack@eecs.umich.edu                default: fisttp();
2335162Sgblack@eecs.umich.edu            }
2346619Sgblack@eecs.umich.edu            0x2: Inst::FST(Eq);
2356619Sgblack@eecs.umich.edu            0x3: Inst::FSTP(Eq);
2365162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
2375162Sgblack@eecs.umich.edu                0x3: fucom();
2385162Sgblack@eecs.umich.edu                default: frstor();
2395162Sgblack@eecs.umich.edu            }
2405162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
2415162Sgblack@eecs.umich.edu                0x3: fucomp();
2424825Sgblack@eecs.umich.edu                default: Inst::UD2();
2434825Sgblack@eecs.umich.edu            }
2445162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
2455162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2465162Sgblack@eecs.umich.edu                default: fnsave();
2475162Sgblack@eecs.umich.edu            }
2485162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
2495162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2505162Sgblack@eecs.umich.edu                default: fnstsw();
2515162Sgblack@eecs.umich.edu            }
2524825Sgblack@eecs.umich.edu        }
2535162Sgblack@eecs.umich.edu        //0x6: esc6();
2545162Sgblack@eecs.umich.edu        0x6: decode MODRM_REG {
2555162Sgblack@eecs.umich.edu            0x0: decode MODRM_MOD {
2565162Sgblack@eecs.umich.edu                0x3: faddp();
2575162Sgblack@eecs.umich.edu                default: fiadd();
2585162Sgblack@eecs.umich.edu            }
2595162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
2605162Sgblack@eecs.umich.edu                0x3: fmulp();
2615162Sgblack@eecs.umich.edu                default: fimul();
2625162Sgblack@eecs.umich.edu            }
2635162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
2645162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
2655162Sgblack@eecs.umich.edu                default: ficom();
2665162Sgblack@eecs.umich.edu            }
2675162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
2685162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
2695162Sgblack@eecs.umich.edu                    0x1: fcompp();
2705162Sgblack@eecs.umich.edu                    default: Inst::UD2();
2715162Sgblack@eecs.umich.edu                }
2725162Sgblack@eecs.umich.edu                default: ficomp();
2735162Sgblack@eecs.umich.edu            }
2745162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
2755162Sgblack@eecs.umich.edu                0x3: fsubrp();
2765162Sgblack@eecs.umich.edu                default: fisub();
2775162Sgblack@eecs.umich.edu            }
2785162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
2795162Sgblack@eecs.umich.edu                0x3: fsubp();
2805162Sgblack@eecs.umich.edu                default: fisubr();
2815162Sgblack@eecs.umich.edu            }
2825162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
2835162Sgblack@eecs.umich.edu                0x3: fdivrp();
2845162Sgblack@eecs.umich.edu                default: fidiv();
2855162Sgblack@eecs.umich.edu            }
2865162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
2875162Sgblack@eecs.umich.edu                0x3: fdivp();
2885162Sgblack@eecs.umich.edu                default: fidivr();
2895162Sgblack@eecs.umich.edu            }
2904825Sgblack@eecs.umich.edu        }
2915162Sgblack@eecs.umich.edu        //0x7: esc7();
2925162Sgblack@eecs.umich.edu        0x7: decode MODRM_REG {
2935162Sgblack@eecs.umich.edu            0x0: decode MODRM_MOD {
2948106Sgblack@eecs.umich.edu                // The ffreep instruction isn't entirely real. It should work
2958106Sgblack@eecs.umich.edu                // the same as ffree but then also pop the register stack.
2968106Sgblack@eecs.umich.edu                0x3: ffreep();
2975162Sgblack@eecs.umich.edu                default: fild();
2984825Sgblack@eecs.umich.edu            }
2995162Sgblack@eecs.umich.edu            0x1: decode MODRM_MOD {
3005162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
3015162Sgblack@eecs.umich.edu                default: fisttp();
3024825Sgblack@eecs.umich.edu            }
3035162Sgblack@eecs.umich.edu            0x2: decode MODRM_MOD {
3045162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
3055162Sgblack@eecs.umich.edu                default: fist();
3065162Sgblack@eecs.umich.edu            }
3075162Sgblack@eecs.umich.edu            0x3: decode MODRM_MOD {
3085162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
3095162Sgblack@eecs.umich.edu                default: fistp();
3105162Sgblack@eecs.umich.edu            }
3115162Sgblack@eecs.umich.edu            0x4: decode MODRM_MOD {
3125162Sgblack@eecs.umich.edu                0x3: decode MODRM_RM {
3135162Sgblack@eecs.umich.edu                    0x0: fnstsw();
3145162Sgblack@eecs.umich.edu                    default: Inst::UD2();
3155162Sgblack@eecs.umich.edu                }
3165162Sgblack@eecs.umich.edu                default: fbld();
3175162Sgblack@eecs.umich.edu            }
3185162Sgblack@eecs.umich.edu            0x5: decode MODRM_MOD {
3195162Sgblack@eecs.umich.edu                0x3: fucomip();
3205162Sgblack@eecs.umich.edu                default: fild();
3215162Sgblack@eecs.umich.edu            }
3225162Sgblack@eecs.umich.edu            0x6: decode MODRM_MOD {
3235162Sgblack@eecs.umich.edu                0x3: fcomip();
3245162Sgblack@eecs.umich.edu                default: fbstp();
3255162Sgblack@eecs.umich.edu            }
3265162Sgblack@eecs.umich.edu            0x7: decode MODRM_MOD {
3275162Sgblack@eecs.umich.edu                0x3: Inst::UD2();
3285162Sgblack@eecs.umich.edu                default: fistp();
3295162Sgblack@eecs.umich.edu            }
3304825Sgblack@eecs.umich.edu        }
3314825Sgblack@eecs.umich.edu    }
3324825Sgblack@eecs.umich.edu}
333