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