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}
|