1 /* 2 * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, 20 * CA 94065 USA or visit www.oracle.com if you need additional information or 21 * have any questions. 22 * 23 */ 24 25 package sun.jvm.hotspot.asm.x86; 26 27 import sun.jvm.hotspot.asm.*; 28 import java.io.*; 29 30 public class X86Disassembler extends Disassembler 31 implements X86Opcodes { 32 private int byteIndex; 33 protected final X86InstructionFactory factory; 34 35 public X86Disassembler(long startPc, byte[] code, X86InstructionFactory factory) { 36 super(startPc, code); 37 this.factory = factory; 38 } 39 40 public X86Disassembler(long startPc, byte[] code) { 41 this(startPc, code, new X86InstructionFactoryImpl()); 42 } 43 44 //Please refer to IA-32 Intel Architecture Software Developer's Manual Volume 2 45 //APPENDIX A - Table A-2. One-byte Opcode Map 46 private static final InstructionDecoder oneByteTable[] = { 47 /* 00 */ 48 new ArithmeticDecoder("addb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_ADD), 49 new ArithmeticDecoder("addS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_ADD), 50 new ArithmeticDecoder("addb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_ADD), 51 new ArithmeticDecoder("addS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_ADD), 52 new ArithmeticDecoder("addb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_ADD), 53 new ArithmeticDecoder("addS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_ADD), 54 new InstructionDecoder("pushl", ADDR_REG, ES), 55 new InstructionDecoder("popl", ADDR_REG, ES), 56 /* 08 */ 57 new LogicalDecoder("orb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_OR), 58 new LogicalDecoder("orS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_OR), 59 new LogicalDecoder("orb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_OR), 60 new LogicalDecoder("orS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_OR), 61 new LogicalDecoder("orb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_OR), 62 new LogicalDecoder("orS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_OR), 63 new InstructionDecoder("pushl", ADDR_REG, CS), 64 null, /* 0x0f extended opcode escape */ 65 /* 10 */ 66 new ArithmeticDecoder("adcb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_ADDC), 67 new ArithmeticDecoder("adcS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_ADDC), 68 new ArithmeticDecoder("adcb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_ADDC), 69 new ArithmeticDecoder("adcS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_ADDC), 70 new ArithmeticDecoder("adcb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_ADDC), 71 new ArithmeticDecoder("adcS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_ADDC), 72 new InstructionDecoder("pushl", ADDR_REG, SS), 73 new InstructionDecoder("popl", ADDR_REG, SS), 74 /* 18 */ 75 new ArithmeticDecoder("sbbb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_SUBC), 76 new ArithmeticDecoder("sbbS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_SUBC), 77 new ArithmeticDecoder("sbbb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_SUBC), 78 new ArithmeticDecoder("sbbS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_SUBC), 79 new ArithmeticDecoder("sbbb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_SUBC), 80 new ArithmeticDecoder("sbbS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_SUBC), 81 new InstructionDecoder("pushl", ADDR_REG, DS), 82 new InstructionDecoder("popl", ADDR_REG, DS), 83 /* 20 */ 84 new LogicalDecoder("andb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_AND), 85 new LogicalDecoder("andS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_AND), 86 new LogicalDecoder("andb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_AND), 87 new LogicalDecoder("andS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_AND), 88 new LogicalDecoder("andb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_AND), 89 new LogicalDecoder("andS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_AND), 90 null, /* SEG es prefix */ 91 new InstructionDecoder("daa"), 92 /* 28 */ 93 new ArithmeticDecoder("subb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_SUB), 94 new ArithmeticDecoder("subS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_SUB), 95 new ArithmeticDecoder("subb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_SUB), 96 new ArithmeticDecoder("subS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_SUB), 97 new ArithmeticDecoder("subb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_SUB), 98 new ArithmeticDecoder("subS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_SUB), 99 null, /* SEG CS prefix */ 100 new InstructionDecoder("das"), 101 /* 30 */ 102 new LogicalDecoder("xorb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_XOR), 103 new LogicalDecoder("xorS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_XOR), 104 new LogicalDecoder("xorb", ADDR_G, b_mode, ADDR_E, b_mode, RTLOP_XOR), 105 new LogicalDecoder("xorS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_XOR), 106 new LogicalDecoder("xorb", ADDR_REG, AL, ADDR_I, b_mode, RTLOP_XOR), 107 new LogicalDecoder("xorS", ADDR_REG, EAX, ADDR_I, v_mode, RTLOP_XOR), 108 null, /* SEG SS prefix */ 109 new InstructionDecoder("aaa"), 110 /* 38 */ 111 new InstructionDecoder("cmpb", ADDR_E, b_mode, ADDR_G, b_mode), 112 new InstructionDecoder("cmpS", ADDR_E, v_mode, ADDR_G, v_mode), 113 new InstructionDecoder("cmpb", ADDR_G, b_mode, ADDR_E, b_mode), 114 new InstructionDecoder("cmpS", ADDR_G, v_mode, ADDR_E, v_mode), 115 new InstructionDecoder("cmpb", ADDR_REG, AL, ADDR_I, b_mode), 116 new InstructionDecoder("cmpS", ADDR_REG, EAX, ADDR_I, v_mode), 117 null, /* SEG DS prefix */ 118 new InstructionDecoder("aas"), 119 /* 40 */ 120 new ArithmeticDecoder("incS", ADDR_REG, EAX, RTLOP_ADD), 121 new ArithmeticDecoder("incS", ADDR_REG, ECX, RTLOP_ADD), 122 new ArithmeticDecoder("incS", ADDR_REG, EDX, RTLOP_ADD), 123 new ArithmeticDecoder("incS", ADDR_REG, EBX, RTLOP_ADD), 124 new ArithmeticDecoder("incS", ADDR_REG, ESP, RTLOP_ADD), 125 new ArithmeticDecoder("incS", ADDR_REG, EBP, RTLOP_ADD), 126 new ArithmeticDecoder("incS", ADDR_REG, ESI, RTLOP_ADD), 127 new ArithmeticDecoder("incS", ADDR_REG, EDI, RTLOP_ADD), 128 /* 48 */ 129 new ArithmeticDecoder("decS", ADDR_REG, EAX, RTLOP_SUB), 130 new ArithmeticDecoder("decS", ADDR_REG, ECX, RTLOP_SUB), 131 new ArithmeticDecoder("decS", ADDR_REG, EDX, RTLOP_SUB), 132 new ArithmeticDecoder("decS", ADDR_REG, EBX, RTLOP_SUB), 133 new ArithmeticDecoder("decS", ADDR_REG, ESP, RTLOP_SUB), 134 new ArithmeticDecoder("decS", ADDR_REG, EBP, RTLOP_SUB), 135 new ArithmeticDecoder("decS", ADDR_REG, ESI, RTLOP_SUB), 136 new ArithmeticDecoder("decS", ADDR_REG, EDI, RTLOP_SUB), 137 /* 50 */ 138 new InstructionDecoder("pushS", ADDR_REG, EAX), 139 new InstructionDecoder("pushS", ADDR_REG, ECX), 140 new InstructionDecoder("pushS", ADDR_REG, EDX), 141 new InstructionDecoder("pushS", ADDR_REG, EBX), 142 new InstructionDecoder("pushS", ADDR_REG, ESP), 143 new InstructionDecoder("pushS", ADDR_REG, EBP), 144 new InstructionDecoder("pushS", ADDR_REG, ESI), 145 new InstructionDecoder("pushS", ADDR_REG, EDI), 146 /* 58 */ 147 new InstructionDecoder("popS", ADDR_REG, EAX), 148 new InstructionDecoder("popS", ADDR_REG, ECX), 149 new InstructionDecoder("popS", ADDR_REG, EDX), 150 new InstructionDecoder("popS", ADDR_REG, EBX), 151 new InstructionDecoder("popS", ADDR_REG, ESP), 152 new InstructionDecoder("popS", ADDR_REG, EBP), 153 new InstructionDecoder("popS", ADDR_REG, ESI), 154 new InstructionDecoder("popS", ADDR_REG, EDI), 155 /* 60 */ 156 new InstructionDecoder("pusha"), 157 new InstructionDecoder("popa"), 158 new InstructionDecoder("boundS", ADDR_G, v_mode, ADDR_E, v_mode), 159 new InstructionDecoder("arpl", ADDR_E, w_mode, ADDR_G, w_mode), 160 null, /* seg fs */ 161 null, /* seg gs */ 162 null, /* op size prefix */ 163 null, /* adr size prefix */ 164 /* 68 */ 165 new InstructionDecoder("pushS", ADDR_I, v_mode), /* 386 book wrong */ 166 new ArithmeticDecoder("imulS", ADDR_G, v_mode, ADDR_E, v_mode, ADDR_I, v_mode, RTLOP_SMUL), 167 new InstructionDecoder("pushl", ADDR_I, b_mode), /* push of byte really pushes 4 bytes */ 168 new ArithmeticDecoder("imulS", ADDR_G, v_mode, ADDR_E, v_mode, ADDR_I, b_mode, RTLOP_SMUL), 169 new InstructionDecoder("insb", ADDR_ESDI, b_mode, INDIR_REG, DX), 170 new InstructionDecoder("insS", ADDR_ESDI, v_mode, INDIR_REG, DX), 171 new InstructionDecoder("outsb", INDIR_REG, DX, ADDR_DSSI, b_mode), 172 new InstructionDecoder("outsS", INDIR_REG, DX, ADDR_DSSI, v_mode), 173 /* 70 */ 174 new ConditionalJmpDecoder("jo", ADDR_J, b_mode), 175 new ConditionalJmpDecoder("jno", ADDR_J, b_mode), 176 new ConditionalJmpDecoder("jb", ADDR_J, b_mode), 177 new ConditionalJmpDecoder("jae", ADDR_J, b_mode), 178 new ConditionalJmpDecoder("je", ADDR_J, b_mode), 179 new ConditionalJmpDecoder("jne", ADDR_J, b_mode), 180 new ConditionalJmpDecoder("jbe", ADDR_J, b_mode), 181 new ConditionalJmpDecoder("ja", ADDR_J, b_mode), 182 /* 78 */ 183 new ConditionalJmpDecoder("js", ADDR_J, b_mode), 184 new ConditionalJmpDecoder("jns", ADDR_J, b_mode), 185 new ConditionalJmpDecoder("jp", ADDR_J, b_mode), 186 new ConditionalJmpDecoder("jnp", ADDR_J, b_mode), 187 new ConditionalJmpDecoder("jl", ADDR_J, b_mode), 188 new ConditionalJmpDecoder("jnl", ADDR_J, b_mode), 189 new ConditionalJmpDecoder("jle", ADDR_J, b_mode), 190 new ConditionalJmpDecoder("jg", ADDR_J, b_mode), 191 /* 80 */ 192 new GRPDecoder(null, 0), 193 new GRPDecoder(null, 1), 194 null, 195 new GRPDecoder(null, 2), 196 new InstructionDecoder("testb", ADDR_E, b_mode, ADDR_G, b_mode), 197 new InstructionDecoder("testS", ADDR_E, v_mode, ADDR_G, v_mode), 198 new MoveDecoder("xchgb", ADDR_E, b_mode, ADDR_G, b_mode), 199 new MoveDecoder("xchgS", ADDR_E, v_mode, ADDR_G, v_mode), 200 /* 88 */ 201 new MoveDecoder("movb", ADDR_E, b_mode, ADDR_G, b_mode), 202 new MoveDecoder("movS", ADDR_E, v_mode, ADDR_G, v_mode), 203 new MoveDecoder("movb", ADDR_G, b_mode, ADDR_E, b_mode), 204 new MoveDecoder("movS", ADDR_G, v_mode, ADDR_E, v_mode), 205 new MoveDecoder("movw", ADDR_E, w_mode, ADDR_SEG, w_mode), 206 new InstructionDecoder("leaS", ADDR_G, v_mode, ADDR_E, 0), 207 new MoveDecoder("movw", ADDR_SEG, w_mode, ADDR_E, w_mode), 208 new InstructionDecoder("popS", ADDR_E, v_mode), 209 /* 90 */ 210 new InstructionDecoder("nop"), 211 new MoveDecoder("xchgS", ADDR_REG, ECX, ADDR_REG, EAX), 212 new MoveDecoder("xchgS", ADDR_REG, EDX, ADDR_REG, EAX), 213 new MoveDecoder("xchgS", ADDR_REG, EBX, ADDR_REG, EAX), 214 new MoveDecoder("xchgS", ADDR_REG, ESP, ADDR_REG, EAX), 215 new MoveDecoder("xchgS", ADDR_REG, EBP, ADDR_REG, EAX), 216 new MoveDecoder("xchgS", ADDR_REG, ESI, ADDR_REG, EAX), 217 new MoveDecoder("xchgS", ADDR_REG, EDI, ADDR_REG, EAX), 218 /* 98 */ 219 new InstructionDecoder("cwtl"), 220 new InstructionDecoder("cltd"), 221 new CallDecoder("lcall", ADDR_DIR, p_mode), 222 null, /* fwait */ 223 new InstructionDecoder("pushf"), 224 new InstructionDecoder("popf"), 225 new InstructionDecoder("sahf"), 226 new InstructionDecoder("lahf"), 227 /* a0 */ 228 new MoveDecoder("movb", ADDR_REG, AL, ADDR_OFF, b_mode), 229 new MoveDecoder("movS", ADDR_REG, EAX, ADDR_OFF, v_mode), 230 new MoveDecoder("movb", ADDR_OFF, b_mode, ADDR_REG, AL), 231 new MoveDecoder("movS", ADDR_OFF, v_mode, ADDR_REG, EAX), 232 new MoveDecoder("movsb", ADDR_ESDI, b_mode, ADDR_DSSI, b_mode), 233 new MoveDecoder("movsS", ADDR_ESDI, v_mode, ADDR_DSSI, v_mode), 234 new InstructionDecoder("cmpsb", ADDR_ESDI, b_mode, ADDR_DSSI, b_mode), 235 new InstructionDecoder("cmpsS", ADDR_ESDI, v_mode, ADDR_DSSI, v_mode), 236 /* a8 */ 237 new InstructionDecoder("testb", ADDR_REG, AL, ADDR_I, b_mode), 238 new InstructionDecoder("testS", ADDR_REG, EAX, ADDR_I, v_mode), 239 new InstructionDecoder("stosb", ADDR_ESDI, b_mode, ADDR_REG, AL), 240 new InstructionDecoder("stosS", ADDR_ESDI, v_mode, ADDR_REG, EAX), 241 new InstructionDecoder("lodsb", ADDR_REG, AL, ADDR_DSSI, b_mode), 242 new InstructionDecoder("lodsS", ADDR_REG, EAX, ADDR_DSSI, v_mode), 243 new InstructionDecoder("scasb", ADDR_REG, AL, ADDR_ESDI, b_mode), 244 new InstructionDecoder("scasS", ADDR_REG, EAX, ADDR_ESDI, v_mode), 245 /* b0 */ 246 new MoveDecoder("movb", ADDR_REG, AL, ADDR_I, b_mode), 247 new MoveDecoder("movb", ADDR_REG, CL, ADDR_I, b_mode), 248 new MoveDecoder("movb", ADDR_REG, DL, ADDR_I, b_mode), 249 new MoveDecoder("movb", ADDR_REG, BL, ADDR_I, b_mode), 250 new MoveDecoder("movb", ADDR_REG, AH, ADDR_I, b_mode), 251 new MoveDecoder("movb", ADDR_REG, CH, ADDR_I, b_mode), 252 new MoveDecoder("movb", ADDR_REG, DH, ADDR_I, b_mode), 253 new MoveDecoder("movb", ADDR_REG, BH, ADDR_I, b_mode), 254 /* b8 */ 255 new MoveDecoder("movS", ADDR_REG, EAX, ADDR_I, v_mode), 256 new MoveDecoder("movS", ADDR_REG, ECX, ADDR_I, v_mode), 257 new MoveDecoder("movS", ADDR_REG, EDX, ADDR_I, v_mode), 258 new MoveDecoder("movS", ADDR_REG, EBX, ADDR_I, v_mode), 259 new MoveDecoder("movS", ADDR_REG, ESP, ADDR_I, v_mode), 260 new MoveDecoder("movS", ADDR_REG, EBP, ADDR_I, v_mode), 261 new MoveDecoder("movS", ADDR_REG, ESI, ADDR_I, v_mode), 262 new MoveDecoder("movS", ADDR_REG, EDI, ADDR_I, v_mode), 263 /* c0 */ 264 new GRPDecoder(null, 3), 265 new GRPDecoder(null, 4), 266 new BranchDecoder("ret", ADDR_I, w_mode), 267 new BranchDecoder("ret"), 268 new InstructionDecoder("lesS", ADDR_G, v_mode, ADDR_E, 0), 269 new InstructionDecoder("ldsS", ADDR_G, v_mode, ADDR_E, 0), 270 new MoveDecoder("movb", ADDR_E, b_mode, ADDR_I, b_mode), 271 new MoveDecoder("movS", ADDR_E, v_mode, ADDR_I, v_mode), 272 /* c8 */ 273 new InstructionDecoder("enter", ADDR_I, w_mode, ADDR_I, b_mode), 274 new InstructionDecoder("leave"), 275 new InstructionDecoder("lret", ADDR_I, w_mode), 276 new InstructionDecoder("lret"), 277 new InstructionDecoder("int3"), 278 new InstructionDecoder("int", ADDR_I, b_mode), 279 new InstructionDecoder("into"), 280 new InstructionDecoder("iret"), 281 /* d0 */ 282 new GRPDecoder(null, 5), 283 new GRPDecoder(null, 6), 284 new GRPDecoder(null, 7), 285 new GRPDecoder(null, 8), 286 new InstructionDecoder("aam", ADDR_I, b_mode), 287 new InstructionDecoder("aad", ADDR_I, b_mode), 288 null, 289 new InstructionDecoder("xlat"), 290 /* d8 */ 291 new FloatDecoder(), 292 new FloatDecoder(), 293 new FloatDecoder(), 294 new FloatDecoder(), 295 new FloatDecoder(), 296 new FloatDecoder(), 297 new FloatDecoder(), 298 new FloatDecoder(), 299 /* e0 */ 300 new BranchDecoder("loopne", ADDR_J, b_mode), 301 new BranchDecoder("loope", ADDR_J, b_mode), 302 new BranchDecoder("loop", ADDR_J, b_mode), 303 new ConditionalJmpDecoder("jCcxz", ADDR_J, b_mode), 304 new InstructionDecoder("inb", ADDR_REG, AL, ADDR_I, b_mode), 305 new InstructionDecoder("inS", ADDR_REG, EAX, ADDR_I, b_mode), 306 new InstructionDecoder("outb", ADDR_I, b_mode, ADDR_REG, AL), 307 new InstructionDecoder("outS", ADDR_I, b_mode, ADDR_REG, EAX), 308 /* e8 */ 309 new CallDecoder("call", ADDR_J, v_mode), 310 new JmpDecoder("jmp", ADDR_J, v_mode), 311 new JmpDecoder("ljmp", ADDR_DIR, p_mode), 312 new JmpDecoder("jmp", ADDR_J, b_mode), 313 new InstructionDecoder("inb", ADDR_REG, AL, INDIR_REG, DX), 314 new InstructionDecoder("inS", ADDR_REG, EAX, INDIR_REG, DX), 315 new InstructionDecoder("outb", INDIR_REG, DX, ADDR_REG,AL), 316 new InstructionDecoder("outS", INDIR_REG, DX, ADDR_REG, EAX), 317 /* f0 */ 318 new InstructionDecoder("lock"), /* lock prefix */ 319 null, 320 new InstructionDecoder("repne"), /* repne */ 321 new InstructionDecoder("rep"), /* repz */ 322 new InstructionDecoder("hlt"), 323 new InstructionDecoder("cmc"), 324 new GRPDecoder(null, 9), 325 new GRPDecoder(null, 10), 326 /* f8 */ 327 new InstructionDecoder("clc"), 328 new InstructionDecoder("stc"), 329 new InstructionDecoder("cli"), 330 new InstructionDecoder("sti"), 331 new InstructionDecoder("cld"), 332 new InstructionDecoder("std"), 333 new GRPDecoder(null, 11), 334 new GRPDecoder(null, 12) 335 }; 336 337 //APPENDIX A - Table A-3. Two-byte Opcode Map 338 private static final InstructionDecoder twoByteTable[] = { 339 /* 00 */ 340 new GRPDecoder(null, 13), 341 new GRPDecoder(null, 14), 342 new InstructionDecoder("larS", ADDR_G, v_mode, ADDR_E, w_mode), 343 new InstructionDecoder("lslS", ADDR_G, v_mode, ADDR_E, w_mode), 344 null, 345 null, 346 new InstructionDecoder("clts"), 347 null, 348 /* 08 */ 349 new InstructionDecoder("invd"), 350 new InstructionDecoder("wbinvd"), 351 null, 352 null, 353 null, 354 null, 355 null, 356 null, 357 /* 10 */ //SSE 358 new SSEMoveDecoder("movups", ADDR_V, ps_mode, ADDR_W, ps_mode), 359 new SSEMoveDecoder("movups", ADDR_W, ps_mode, ADDR_V, ps_mode), 360 new SSEMoveDecoder("movlps", ADDR_W, q_mode, ADDR_V, q_mode), 361 new SSEMoveDecoder("movlps", ADDR_V, q_mode, ADDR_W, q_mode), 362 new SSEInstructionDecoder("unpcklps", ADDR_V, ps_mode, ADDR_W, q_mode), 363 new SSEInstructionDecoder("unpckhps", ADDR_V, ps_mode, ADDR_W, q_mode), 364 new SSEMoveDecoder("movhps", ADDR_V, q_mode, ADDR_W, q_mode), 365 new SSEMoveDecoder("movhps", ADDR_W, q_mode, ADDR_V, q_mode), 366 /* 18 */ 367 new GRPDecoder(null, 21), 368 null, 369 null, 370 null, 371 null, 372 null, 373 null, 374 null, 375 /* 20 */ 376 /* these are all backward in appendix A of the intel book */ 377 new MoveDecoder("movl", ADDR_R, d_mode, ADDR_C, d_mode), 378 new MoveDecoder("movl", ADDR_R, d_mode, ADDR_D, d_mode), 379 new MoveDecoder("movl", ADDR_C, d_mode, ADDR_R, d_mode), 380 new MoveDecoder("movl", ADDR_D, d_mode, ADDR_R, d_mode), 381 new MoveDecoder("movl", ADDR_R, d_mode, ADDR_T, d_mode), 382 null, 383 new MoveDecoder("movl", ADDR_T, d_mode, ADDR_R, d_mode), 384 null, 385 /* 28 */ 386 new SSEMoveDecoder("movaps", ADDR_V, ps_mode, ADDR_W, ps_mode), 387 new SSEMoveDecoder("movaps", ADDR_W, ps_mode, ADDR_V, ps_mode), 388 new SSEInstructionDecoder("cvtpi2ps", ADDR_V, ps_mode, ADDR_Q, q_mode), 389 new SSEMoveDecoder("movntps", ADDR_W, ps_mode, ADDR_V, ps_mode), 390 new SSEInstructionDecoder("cvttps2pi", ADDR_Q, q_mode, ADDR_W, ps_mode), 391 new SSEInstructionDecoder("cvtps2pi", ADDR_Q, q_mode, ADDR_W, ps_mode), 392 new SSEInstructionDecoder("ucomiss", ADDR_V, ss_mode, ADDR_W, ss_mode), 393 new SSEInstructionDecoder("comiss", ADDR_V, ps_mode, ADDR_W, ps_mode), 394 /* 30 */ 395 new SSEInstructionDecoder("wrmsr"), 396 new SSEInstructionDecoder("rtdsc"), 397 new SSEInstructionDecoder("rdmsr"), 398 new SSEInstructionDecoder("rdpmc"), 399 new SSEInstructionDecoder("sysenter"), 400 new SSEInstructionDecoder("sysexit"), 401 null, 402 null, 403 /* 38 */ 404 null, 405 null, 406 null, 407 null, 408 new SSEMoveDecoder("movnti", ADDR_G, v_mode, ADDR_E, v_mode), 409 null, 410 null, 411 null, 412 /* 40 */ 413 new MoveDecoder("cmovo", ADDR_G, v_mode, ADDR_E, v_mode), 414 new MoveDecoder("cmovno", ADDR_G, v_mode, ADDR_E, v_mode), 415 new MoveDecoder("cmovb", ADDR_G, v_mode, ADDR_E, v_mode), 416 new MoveDecoder("cmovae", ADDR_G, v_mode, ADDR_E, v_mode), 417 new MoveDecoder("cmove", ADDR_G, v_mode, ADDR_E, v_mode), 418 new MoveDecoder("cmovne", ADDR_G, v_mode, ADDR_E, v_mode), 419 new MoveDecoder("cmovbe", ADDR_G, v_mode, ADDR_E, v_mode), 420 new MoveDecoder("cmova", ADDR_G, v_mode, ADDR_E, v_mode), 421 /* 48 */ 422 new MoveDecoder("cmovs", ADDR_G, v_mode, ADDR_E, v_mode), 423 new MoveDecoder("cmovns", ADDR_G, v_mode, ADDR_E, v_mode), 424 new MoveDecoder("cmovp", ADDR_G, v_mode, ADDR_E, v_mode), 425 new MoveDecoder("cmovnp", ADDR_G, v_mode, ADDR_E, v_mode), 426 new MoveDecoder("cmovl", ADDR_G, v_mode, ADDR_E, v_mode), 427 new MoveDecoder("cmovge", ADDR_G, v_mode, ADDR_E, v_mode), 428 new MoveDecoder("cmovle", ADDR_G, v_mode, ADDR_E, v_mode), 429 new MoveDecoder("cmovg", ADDR_G, v_mode, ADDR_E, v_mode), 430 /* 50 */ 431 new SSEMoveDecoder("movmskps", ADDR_E, d_mode, ADDR_V, ps_mode), 432 new SSEInstructionDecoder("sqrtps", ADDR_V, ps_mode, ADDR_W, ps_mode), 433 new SSEInstructionDecoder("rsqrtps", ADDR_V, ps_mode, ADDR_W, ps_mode), 434 new SSEInstructionDecoder("rcpps", ADDR_V, ps_mode, ADDR_W, ps_mode), 435 new SSELogicalDecoder("andps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_AND), 436 new SSELogicalDecoder("andnps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_AND), 437 new SSELogicalDecoder("orps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_OR), 438 new SSELogicalDecoder("xorps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_XOR), 439 /* 58 */ 440 new SSEArithmeticDecoder("addps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_ADD), 441 new SSEArithmeticDecoder("mulps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_SMUL), 442 new SSEInstructionDecoder("cvtps2pd", ADDR_V, pd_mode, ADDR_W, ps_mode), 443 new SSEInstructionDecoder("cvtdq2ps", ADDR_V, ps_mode, ADDR_W, dq_mode), 444 new SSEArithmeticDecoder("subps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_SUB), 445 new SSEInstructionDecoder("minps", ADDR_V, ps_mode, ADDR_W, ps_mode), 446 new SSEArithmeticDecoder("divps", ADDR_V, ps_mode, ADDR_W, ps_mode, RTLOP_SDIV), 447 new SSEInstructionDecoder("maxps", ADDR_V, ps_mode, ADDR_W, ps_mode), 448 /* 60 */ 449 new SSEInstructionDecoder("punpcklbw", ADDR_P, q_mode, ADDR_Q, d_mode), 450 new SSEInstructionDecoder("punpcklwd", ADDR_P, q_mode, ADDR_Q, d_mode), 451 new SSEInstructionDecoder("punpckldq", ADDR_P, q_mode, ADDR_Q, d_mode), 452 new SSEInstructionDecoder("packsswb", ADDR_P, q_mode, ADDR_Q, q_mode), 453 new SSEInstructionDecoder("pcmpgtb", ADDR_P, q_mode, ADDR_Q, q_mode), 454 new SSEInstructionDecoder("pcmpgtw", ADDR_P, q_mode, ADDR_Q, q_mode), 455 new SSEInstructionDecoder("pcmpgtd", ADDR_P, q_mode, ADDR_Q, q_mode), 456 new SSEInstructionDecoder("packuswb", ADDR_P, q_mode, ADDR_Q, q_mode), 457 /* 68 */ 458 new SSEInstructionDecoder("punpckhbw", ADDR_P, q_mode, ADDR_Q, d_mode), 459 new SSEInstructionDecoder("punpckhwd", ADDR_P, q_mode, ADDR_Q, d_mode), 460 new SSEInstructionDecoder("punpckhdq", ADDR_P, q_mode, ADDR_Q, d_mode), 461 new SSEInstructionDecoder("packssdw", ADDR_P, q_mode, ADDR_Q, d_mode), 462 null, 463 null, 464 new SSEMoveDecoder("movd", ADDR_P, d_mode, ADDR_E, d_mode), 465 new SSEMoveDecoder("movq", ADDR_P, q_mode, ADDR_E, q_mode), 466 /* 70 */ 467 new SSEInstructionDecoder("pshufw", ADDR_P, q_mode, ADDR_Q, q_mode, ADDR_I, b_mode), 468 new GRPDecoder(null, 17), 469 new GRPDecoder(null, 18), 470 new GRPDecoder(null, 19), 471 new SSEInstructionDecoder("pcmpeqb", ADDR_P, q_mode, ADDR_Q, q_mode), 472 new SSEInstructionDecoder("pcmpeqw", ADDR_P, q_mode, ADDR_Q, q_mode), 473 new SSEInstructionDecoder("pcmpeqd", ADDR_P, q_mode, ADDR_Q, q_mode), 474 new SSEInstructionDecoder("emms"), 475 /* 78 */ 476 null, 477 null, 478 null, 479 null, 480 null, 481 null, 482 new SSEMoveDecoder("movd", ADDR_E, d_mode, ADDR_P, d_mode), 483 new SSEMoveDecoder("movq", ADDR_Q, q_mode, ADDR_P, q_mode), 484 /* 80 */ 485 new ConditionalJmpDecoder("jo", ADDR_J, v_mode), 486 new ConditionalJmpDecoder("jno", ADDR_J, v_mode), 487 new ConditionalJmpDecoder("jb", ADDR_J, v_mode), 488 new ConditionalJmpDecoder("jae", ADDR_J, v_mode), 489 new ConditionalJmpDecoder("je", ADDR_J, v_mode), 490 new ConditionalJmpDecoder("jne", ADDR_J, v_mode), 491 new ConditionalJmpDecoder("jbe", ADDR_J, v_mode), 492 new ConditionalJmpDecoder("ja", ADDR_J, v_mode), 493 /* 88 */ 494 new ConditionalJmpDecoder("js", ADDR_J, v_mode), 495 new ConditionalJmpDecoder("jns", ADDR_J, v_mode), 496 new ConditionalJmpDecoder("jp", ADDR_J, v_mode), 497 new ConditionalJmpDecoder("jnp", ADDR_J, v_mode), 498 new ConditionalJmpDecoder("jl", ADDR_J, v_mode), 499 new ConditionalJmpDecoder("jge", ADDR_J, v_mode), 500 new ConditionalJmpDecoder("jle", ADDR_J, v_mode), 501 new ConditionalJmpDecoder("jg", ADDR_J, v_mode), 502 /* 90 */ 503 new InstructionDecoder("seto", ADDR_E, b_mode), 504 new InstructionDecoder("setno", ADDR_E, b_mode), 505 new InstructionDecoder("setb", ADDR_E, b_mode), 506 new InstructionDecoder("setae", ADDR_E, b_mode), 507 new InstructionDecoder("sete", ADDR_E, b_mode), 508 new InstructionDecoder("setne", ADDR_E, b_mode), 509 new InstructionDecoder("setbe", ADDR_E, b_mode), 510 new InstructionDecoder("seta", ADDR_E, b_mode), 511 /* 98 */ 512 new InstructionDecoder("sets", ADDR_E, b_mode), 513 new InstructionDecoder("setns", ADDR_E, b_mode), 514 new InstructionDecoder("setp", ADDR_E, b_mode), 515 new InstructionDecoder("setnp", ADDR_E, b_mode), 516 new InstructionDecoder("setl", ADDR_E, b_mode), 517 new InstructionDecoder("setge", ADDR_E, b_mode), 518 new InstructionDecoder("setle", ADDR_E, b_mode), 519 new InstructionDecoder("setg", ADDR_E, b_mode), 520 /* a0 */ 521 new InstructionDecoder("pushl", ADDR_REG, FS), 522 new InstructionDecoder("popl", ADDR_REG, FS), 523 null, 524 new InstructionDecoder("btS", ADDR_E, v_mode, ADDR_G, v_mode), 525 new InstructionDecoder("shldS", ADDR_E, v_mode, ADDR_G, v_mode, ADDR_I, b_mode), 526 new InstructionDecoder("shldS", ADDR_E, v_mode, ADDR_G, v_mode, ADDR_REG, CL), 527 null, 528 null, 529 /* a8 */ 530 new InstructionDecoder("pushl", ADDR_REG, GS), 531 new InstructionDecoder("popl", ADDR_REG, GS), 532 new SSEInstructionDecoder("rsm"), 533 new InstructionDecoder("btsS", ADDR_E, v_mode, ADDR_G, v_mode), 534 new InstructionDecoder("shrdS", ADDR_E, v_mode, ADDR_G, v_mode, ADDR_I, b_mode), 535 new InstructionDecoder("shrdS", ADDR_E, v_mode, ADDR_G, v_mode, ADDR_REG, CL), 536 new GRPDecoder(null, 20), 537 new ArithmeticDecoder("imulS", ADDR_G, v_mode, ADDR_E, v_mode, RTLOP_SMUL), 538 /* b0 */ 539 new InstructionDecoder("cmpxchgb", ADDR_E, b_mode, ADDR_G, b_mode), 540 new InstructionDecoder("cmpxchgS", ADDR_E, v_mode, ADDR_G, v_mode), 541 new InstructionDecoder("lssS", ADDR_G, v_mode, ADDR_M, p_mode), 542 new InstructionDecoder("btrS", ADDR_E, v_mode, ADDR_G, v_mode), 543 new InstructionDecoder("lfsS", ADDR_G, v_mode, ADDR_M, p_mode), 544 new InstructionDecoder("lgsS", ADDR_G, v_mode, ADDR_M, p_mode), 545 new MoveDecoder("movzbS", ADDR_G, v_mode, ADDR_E, b_mode), 546 new MoveDecoder("movzwS", ADDR_G, v_mode, ADDR_E, w_mode), 547 /* b8 */ 548 null, 549 null, 550 new GRPDecoder(null, 15), 551 new InstructionDecoder("btcS", ADDR_E, v_mode, ADDR_G, v_mode), 552 new InstructionDecoder("bsfS", ADDR_G, v_mode, ADDR_E, v_mode), 553 new InstructionDecoder("bsrS", ADDR_G, v_mode, ADDR_E, v_mode), 554 new MoveDecoder("movsbS", ADDR_G, v_mode, ADDR_E, b_mode), 555 new MoveDecoder("movswS", ADDR_G, v_mode, ADDR_E, w_mode), 556 /* c0 */ 557 new ArithmeticDecoder("xaddb", ADDR_E, b_mode, ADDR_G, b_mode, RTLOP_ADD), 558 new ArithmeticDecoder("xaddS", ADDR_E, v_mode, ADDR_G, v_mode, RTLOP_ADD), 559 new SSEInstructionDecoder("cmpps", ADDR_V, ps_mode, ADDR_W, ps_mode, ADDR_I, b_mode), 560 new SSEMoveDecoder("movnti", ADDR_E, d_mode, ADDR_G, d_mode), 561 new SSEInstructionDecoder("pinsrw", ADDR_P, q_mode, ADDR_E, d_mode, ADDR_I, b_mode), 562 new SSEInstructionDecoder("pextrw", ADDR_G, d_mode, ADDR_P, q_mode, ADDR_I, b_mode), 563 new SSEInstructionDecoder("shufps", ADDR_V, ps_mode, ADDR_W, ps_mode, ADDR_I, b_mode), 564 new GRPDecoder(null, 16), 565 /* c8 */ 566 new InstructionDecoder("bswap", ADDR_REG, EAX), 567 new InstructionDecoder("bswap", ADDR_REG, ECX), 568 new InstructionDecoder("bswap", ADDR_REG, EDX), 569 new InstructionDecoder("bswap", ADDR_REG, EBX), 570 new InstructionDecoder("bswap", ADDR_REG, ESP), 571 new InstructionDecoder("bswap", ADDR_REG, EBP), 572 new InstructionDecoder("bswap", ADDR_REG, ESI), 573 new InstructionDecoder("bswap", ADDR_REG, EDI), 574 /* d0 */ 575 null, 576 new SSEShiftDecoder("psrlw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SRL), 577 new SSEShiftDecoder("psrld", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SRL), 578 new SSEShiftDecoder("psrlq", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SRL), 579 new SSEArithmeticDecoder("paddq", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 580 new SSEArithmeticDecoder("pmullw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SMUL), 581 null, 582 new SSEMoveDecoder("pmovmskb", ADDR_G, d_mode, ADDR_P, q_mode), 583 /* d8 */ 584 new SSEArithmeticDecoder("psubusb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 585 new SSEArithmeticDecoder("psubusw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 586 new SSEInstructionDecoder("pminub", ADDR_P, q_mode, ADDR_Q, q_mode), 587 new SSELogicalDecoder("pand", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_AND), 588 new SSEArithmeticDecoder("paddusb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 589 new SSEArithmeticDecoder("paddusw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 590 new SSEInstructionDecoder("pmaxub", ADDR_P, q_mode, ADDR_Q, q_mode), 591 new SSELogicalDecoder("pandn", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_AND), 592 /* e0 */ 593 new SSEInstructionDecoder("pavgb", ADDR_P, q_mode, ADDR_Q, q_mode), 594 new SSEInstructionDecoder("psraw", ADDR_P, q_mode, ADDR_Q, q_mode), 595 new SSEInstructionDecoder("psrad", ADDR_P, q_mode, ADDR_Q, q_mode), 596 new SSEInstructionDecoder("pavgw", ADDR_P, q_mode, ADDR_Q, q_mode), 597 new SSEArithmeticDecoder("pmulhuw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_UMUL), 598 new SSEArithmeticDecoder("pmulhw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SMUL), 599 null, 600 new SSEMoveDecoder("movntq", ADDR_W, q_mode, ADDR_V, q_mode), 601 /* e8 */ 602 new SSEArithmeticDecoder("psubsb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 603 new SSEArithmeticDecoder("psubsw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 604 new SSEInstructionDecoder("pminsw", ADDR_P, q_mode, ADDR_Q, q_mode), 605 new SSELogicalDecoder("por", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_OR), 606 new SSEArithmeticDecoder("paddsb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 607 new SSEArithmeticDecoder("paddsw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 608 new SSEInstructionDecoder("pmaxsw", ADDR_P, q_mode, ADDR_Q, q_mode), 609 new SSELogicalDecoder("pxor", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_XOR), 610 /* f0 */ 611 null, 612 new SSEShiftDecoder("psllw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SLL), 613 new SSEShiftDecoder("pslld", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SLL), 614 new SSEShiftDecoder("psllq", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SLL), 615 new SSEArithmeticDecoder("pmuludq", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_UMUL), 616 new SSEArithmeticDecoder("pmaddwd", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 617 new SSEArithmeticDecoder("psadbw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 618 new SSEMoveDecoder("maskmoveq", ADDR_P, pi_mode, ADDR_Q, pi_mode), 619 /* f8 */ 620 new SSEArithmeticDecoder("psubb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 621 new SSEArithmeticDecoder("psubw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 622 new SSEArithmeticDecoder("psubd", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 623 new SSEArithmeticDecoder("psubq", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_SUB), 624 new SSEArithmeticDecoder("paddb", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 625 new SSEArithmeticDecoder("paddw", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 626 new SSEArithmeticDecoder("paddd", ADDR_P, q_mode, ADDR_Q, q_mode, RTLOP_ADD), 627 null 628 }; 629 630 private static final InstructionDecoder twoBytePrefixF2Table[] = { 631 /* 00 */ 632 null, 633 null, 634 null, 635 null, 636 null, 637 null, 638 null, 639 null, 640 /* 08 */ 641 null, 642 null, 643 null, 644 null, 645 null, 646 null, 647 null, 648 null, 649 /* 10 */ 650 new SSEMoveDecoder("movsd", ADDR_V, sd_mode, ADDR_W, sd_mode), 651 new SSEMoveDecoder("movsd", ADDR_V, sd_mode, ADDR_W, sd_mode), 652 null, 653 null, 654 null, 655 null, 656 null, 657 null, 658 /* 18 */ 659 null, 660 null, 661 null, 662 null, 663 null, 664 null, 665 null, 666 null, 667 /* 20 */ 668 null, 669 null, 670 null, 671 null, 672 null, 673 null, 674 null, 675 null, 676 /* 28 */ 677 null, 678 null, 679 new SSEInstructionDecoder("cvtsi2sd", ADDR_V, sd_mode, ADDR_E, d_mode), 680 null, 681 new SSEInstructionDecoder("cvttsd2si", ADDR_G, d_mode, ADDR_W, sd_mode), 682 new SSEInstructionDecoder("cvtsd2si", ADDR_G, d_mode, ADDR_W, sd_mode), 683 null, 684 null, 685 /* 30 */ 686 null, 687 null, 688 null, 689 null, 690 null, 691 null, 692 null, 693 null, 694 /* 38 */ 695 null, 696 null, 697 null, 698 null, 699 null, 700 null, 701 null, 702 null, 703 /* 40 */ 704 null, 705 null, 706 null, 707 null, 708 null, 709 null, 710 null, 711 null, 712 /* 48 */ 713 null, 714 null, 715 null, 716 null, 717 null, 718 null, 719 null, 720 null, 721 /* 50 */ 722 null, 723 new SSEInstructionDecoder("sqrtsd", ADDR_V, sd_mode, ADDR_W, sd_mode), 724 null, 725 null, 726 null, 727 null, 728 null, 729 null, 730 /* 58 */ 731 new SSEArithmeticDecoder("addsd", ADDR_V, sd_mode, ADDR_W, sd_mode, RTLOP_ADD), 732 new SSEArithmeticDecoder("mulsd", ADDR_V, sd_mode, ADDR_W, sd_mode, RTLOP_SMUL), 733 new SSEInstructionDecoder("cvtsd2ss", ADDR_V, sd_mode, ADDR_W, sd_mode), 734 null, 735 new SSEArithmeticDecoder("subsd", ADDR_V, sd_mode, ADDR_W, sd_mode, RTLOP_SUB), 736 new SSEInstructionDecoder("minsd", ADDR_V, sd_mode, ADDR_W, sd_mode), 737 new SSEArithmeticDecoder("divsd", ADDR_V, sd_mode, ADDR_W, sd_mode, RTLOP_SDIV), 738 new SSEInstructionDecoder("maxsd", ADDR_V, sd_mode, ADDR_W, sd_mode), 739 /* 60 */ 740 null, 741 null, 742 null, 743 null, 744 null, 745 null, 746 null, 747 null, 748 /* 68 */ 749 null, 750 null, 751 null, 752 null, 753 null, 754 null, 755 null, 756 null, 757 /* 70 */ 758 new SSEInstructionDecoder("pshuflw", ADDR_V, dq_mode, ADDR_W, dq_mode, ADDR_I, b_mode), 759 null, 760 null, 761 null, 762 null, 763 null, 764 null, 765 null, 766 /* 78 */ 767 null, 768 null, 769 null, 770 null, 771 null, 772 null, 773 null, 774 null, 775 /* 80 */ 776 null, 777 null, 778 null, 779 null, 780 null, 781 null, 782 null, 783 null, 784 /* 88 */ 785 null, 786 null, 787 null, 788 null, 789 null, 790 null, 791 null, 792 null, 793 /* 90 */ 794 null, 795 null, 796 null, 797 null, 798 null, 799 null, 800 null, 801 null, 802 /* 98 */ 803 null, 804 null, 805 null, 806 null, 807 null, 808 null, 809 null, 810 null, 811 /* a0 */ 812 null, 813 null, 814 null, 815 null, 816 null, 817 null, 818 null, 819 null, 820 /* a8 */ 821 null, 822 null, 823 null, 824 null, 825 null, 826 null, 827 null, 828 null, 829 /* b0 */ 830 null, 831 null, 832 null, 833 null, 834 null, 835 null, 836 null, 837 null, 838 /* b8 */ 839 null, 840 null, 841 null, 842 null, 843 null, 844 null, 845 null, 846 null, 847 /* c0 */ 848 null, 849 null, 850 new SSEInstructionDecoder("cmpsd", ADDR_V, sd_mode, ADDR_W, sd_mode, ADDR_I, b_mode), 851 null, 852 null, 853 null, 854 null, 855 null, 856 /* c8 */ 857 null, 858 null, 859 null, 860 null, 861 null, 862 null, 863 null, 864 null, 865 /* d0 */ 866 null, 867 null, 868 null, 869 null, 870 null, 871 null, 872 new SSEMoveDecoder("movdq2q", ADDR_P, q_mode, ADDR_W, q_mode), 873 null, 874 /* d8 */ 875 null, 876 null, 877 null, 878 null, 879 null, 880 null, 881 null, 882 null, 883 /* e0 */ 884 null, 885 null, 886 null, 887 null, 888 null, 889 null, 890 new SSEInstructionDecoder("cvtpd2dq", ADDR_V, dq_mode, ADDR_W, pd_mode), 891 null, 892 /* e8 */ 893 null, 894 null, 895 null, 896 null, 897 null, 898 null, 899 null, 900 null, 901 /* f0 */ 902 null, 903 null, 904 null, 905 null, 906 null, 907 null, 908 null, 909 null, 910 /* f8 */ 911 null, 912 null, 913 null, 914 null, 915 null, 916 null, 917 null, 918 null 919 }; 920 921 private static final InstructionDecoder twoBytePrefixF3Table[] = { 922 /* 00 */ 923 null, 924 null, 925 null, 926 null, 927 null, 928 null, 929 null, 930 null, 931 /* 08 */ 932 null, 933 null, 934 null, 935 null, 936 null, 937 null, 938 null, 939 null, 940 /* 10 */ 941 new SSEMoveDecoder("movss", ADDR_V, ss_mode, ADDR_W, ss_mode), 942 new SSEMoveDecoder("movss", ADDR_W, ss_mode, ADDR_V, ss_mode), 943 null, 944 null, 945 null, 946 null, 947 null, 948 null, 949 /* 18 */ 950 null, 951 null, 952 null, 953 null, 954 null, 955 null, 956 null, 957 null, 958 /* 20 */ 959 null, 960 null, 961 null, 962 null, 963 null, 964 null, 965 null, 966 null, 967 /* 28 */ 968 null, 969 null, 970 new SSEInstructionDecoder("cvtsi2ss", ADDR_V, ss_mode, ADDR_E, d_mode), 971 null, 972 new SSEInstructionDecoder("cvttss2si", ADDR_G, d_mode, ADDR_W, ss_mode), 973 new SSEInstructionDecoder("cvtss2si", ADDR_G, d_mode, ADDR_W, ss_mode), 974 null, 975 null, 976 /* 30 */ 977 null, 978 null, 979 null, 980 null, 981 null, 982 null, 983 null, 984 null, 985 /* 38 */ 986 null, 987 null, 988 null, 989 null, 990 null, 991 null, 992 null, 993 null, 994 /* 40 */ 995 null, 996 null, 997 null, 998 null, 999 null, 1000 null, 1001 null, 1002 null, 1003 /* 48 */ 1004 null, 1005 null, 1006 null, 1007 null, 1008 null, 1009 null, 1010 null, 1011 null, 1012 /* 50 */ 1013 null, 1014 new SSEInstructionDecoder("sqrtss", ADDR_V, ss_mode, ADDR_W, ss_mode), 1015 new SSEInstructionDecoder("rsqrtss", ADDR_V, ss_mode, ADDR_W, ss_mode), 1016 new SSEInstructionDecoder("rcpss", ADDR_V, ss_mode, ADDR_W, ss_mode), 1017 null, 1018 null, 1019 null, 1020 null, 1021 /* 58 */ 1022 new SSEArithmeticDecoder("addss", ADDR_V, ss_mode, ADDR_W, ss_mode, RTLOP_ADD), 1023 new SSEArithmeticDecoder("mulss", ADDR_V, ss_mode, ADDR_W, ss_mode, RTLOP_SMUL), 1024 new SSEInstructionDecoder("cvtss2sd", ADDR_V, ss_mode, ADDR_W, ss_mode), 1025 new SSEInstructionDecoder("cvttps2dq", ADDR_V, dq_mode, ADDR_W, ps_mode), 1026 new SSEArithmeticDecoder("subss", ADDR_V, ss_mode, ADDR_W, ss_mode, RTLOP_SUB), 1027 new SSEInstructionDecoder("minss", ADDR_V, ss_mode, ADDR_W, ss_mode), 1028 new SSEArithmeticDecoder("divss", ADDR_V, ss_mode, ADDR_W, ss_mode, RTLOP_SDIV), 1029 new SSEInstructionDecoder("maxss", ADDR_V, ss_mode, ADDR_W, ss_mode), 1030 /* 60 */ 1031 null, 1032 null, 1033 null, 1034 null, 1035 null, 1036 null, 1037 null, 1038 null, 1039 /* 68 */ 1040 null, 1041 null, 1042 null, 1043 null, 1044 null, 1045 null, 1046 null, 1047 new SSEMoveDecoder("movdqu", ADDR_V, dq_mode, ADDR_W, dq_mode), 1048 /* 70 */ 1049 new SSEInstructionDecoder("pshufhw", ADDR_V, dq_mode, ADDR_W, dq_mode, ADDR_I, b_mode), 1050 null, 1051 null, 1052 null, 1053 null, 1054 null, 1055 null, 1056 null, 1057 /* 78 */ 1058 null, 1059 null, 1060 null, 1061 null, 1062 null, 1063 null, 1064 new SSEMoveDecoder("movq", ADDR_V, q_mode, ADDR_W, q_mode), 1065 new SSEMoveDecoder("movdqu", ADDR_W, dq_mode, ADDR_V, dq_mode), 1066 /* 80 */ 1067 null, 1068 null, 1069 null, 1070 null, 1071 null, 1072 null, 1073 null, 1074 null, 1075 /* 88 */ 1076 null, 1077 null, 1078 null, 1079 null, 1080 null, 1081 null, 1082 null, 1083 null, 1084 /* 90 */ 1085 null, 1086 null, 1087 null, 1088 null, 1089 null, 1090 null, 1091 null, 1092 null, 1093 /* 98 */ 1094 null, 1095 null, 1096 null, 1097 null, 1098 null, 1099 null, 1100 null, 1101 null, 1102 /* a0 */ 1103 null, 1104 null, 1105 null, 1106 null, 1107 null, 1108 null, 1109 null, 1110 null, 1111 /* a8 */ 1112 null, 1113 null, 1114 null, 1115 null, 1116 null, 1117 null, 1118 null, 1119 null, 1120 /* b0 */ 1121 null, 1122 null, 1123 null, 1124 null, 1125 null, 1126 null, 1127 null, 1128 null, 1129 /* b8 */ 1130 null, 1131 null, 1132 null, 1133 null, 1134 null, 1135 null, 1136 null, 1137 null, 1138 /* c0 */ 1139 null, 1140 null, 1141 new SSEInstructionDecoder("cmpss", ADDR_V, ss_mode, ADDR_W, ss_mode, ADDR_I, b_mode), 1142 null, 1143 null, 1144 null, 1145 null, 1146 null, 1147 /* c8 */ 1148 null, 1149 null, 1150 null, 1151 null, 1152 null, 1153 null, 1154 null, 1155 null, 1156 /* d0 */ 1157 null, 1158 null, 1159 null, 1160 null, 1161 null, 1162 null, 1163 new SSEMoveDecoder("movq2dq", ADDR_V, dq_mode, ADDR_Q, q_mode), 1164 null, 1165 /* d8 */ 1166 null, 1167 null, 1168 null, 1169 null, 1170 null, 1171 null, 1172 null, 1173 null, 1174 /* e0 */ 1175 null, 1176 null, 1177 null, 1178 null, 1179 null, 1180 null, 1181 new SSEInstructionDecoder("cvtdq2pd", ADDR_V, pd_mode, ADDR_W, dq_mode), 1182 null, 1183 /* e8 */ 1184 null, 1185 null, 1186 null, 1187 null, 1188 null, 1189 null, 1190 null, 1191 null, 1192 /* f0 */ 1193 null, 1194 null, 1195 null, 1196 null, 1197 null, 1198 null, 1199 null, 1200 null, 1201 /* f8 */ 1202 null, 1203 null, 1204 null, 1205 null, 1206 null, 1207 null, 1208 null, 1209 null 1210 }; 1211 1212 private static final InstructionDecoder twoBytePrefix66Table[] = { 1213 /* 00 */ 1214 null, 1215 null, 1216 null, 1217 null, 1218 null, 1219 null, 1220 null, 1221 null, 1222 /* 08 */ 1223 null, 1224 null, 1225 null, 1226 null, 1227 null, 1228 null, 1229 null, 1230 null, 1231 /* 10 */ 1232 new SSEMoveDecoder("movupd", ADDR_V, pd_mode, ADDR_W, pd_mode), 1233 new SSEMoveDecoder("movupd", ADDR_W, pd_mode, ADDR_V, pd_mode), 1234 new SSEMoveDecoder("movlpd", ADDR_V, q_mode, ADDR_W, s_mode), 1235 new SSEMoveDecoder("movlpd", ADDR_V, q_mode, ADDR_W, q_mode), 1236 new SSEInstructionDecoder("unpcklpd", ADDR_V, pd_mode, ADDR_W, q_mode), 1237 new SSEInstructionDecoder("unpckhpd", ADDR_V, pd_mode, ADDR_W, q_mode), 1238 new SSEMoveDecoder("movhpd", ADDR_V, q_mode, ADDR_W, q_mode), 1239 new SSEMoveDecoder("movhpd", ADDR_W, q_mode, ADDR_V, q_mode), 1240 /* 18 */ 1241 null, 1242 null, 1243 null, 1244 null, 1245 null, 1246 null, 1247 null, 1248 null, 1249 /* 20 */ 1250 null, 1251 null, 1252 null, 1253 null, 1254 null, 1255 null, 1256 null, 1257 null, 1258 /* 28 */ 1259 new SSEMoveDecoder("movapd", ADDR_V, pd_mode, ADDR_W, pd_mode), 1260 new SSEMoveDecoder("movapd", ADDR_W, pd_mode, ADDR_V, pd_mode), 1261 new SSEInstructionDecoder("cvtpi2pd", ADDR_V, pd_mode, ADDR_Q, dq_mode), 1262 new SSEMoveDecoder("movntpd", ADDR_W, pd_mode, ADDR_V, pd_mode), 1263 new SSEInstructionDecoder("cvttpd2pi", ADDR_Q, dq_mode, ADDR_W, pd_mode), 1264 new SSEInstructionDecoder("cvtpd2pi", ADDR_Q, dq_mode, ADDR_W, pd_mode), 1265 new SSEInstructionDecoder("ucomisd", ADDR_V, sd_mode, ADDR_W, sd_mode), 1266 new SSEInstructionDecoder("comisd", ADDR_V, sd_mode, ADDR_W, sd_mode), 1267 /* 30 */ 1268 null, 1269 null, 1270 null, 1271 null, 1272 null, 1273 null, 1274 null, 1275 null, 1276 /* 38 */ 1277 null, 1278 null, 1279 null, 1280 null, 1281 null, 1282 null, 1283 null, 1284 null, 1285 /* 40 */ 1286 null, 1287 null, 1288 null, 1289 null, 1290 null, 1291 null, 1292 null, 1293 null, 1294 /* 48 */ 1295 null, 1296 null, 1297 null, 1298 null, 1299 null, 1300 null, 1301 null, 1302 null, 1303 /* 50 */ 1304 new SSEMoveDecoder("movmskpd", ADDR_E, d_mode, ADDR_V, pd_mode), 1305 new SSEInstructionDecoder("sqrtpd", ADDR_V, pd_mode, ADDR_W, pd_mode), 1306 null, 1307 null, 1308 new SSELogicalDecoder("andpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_AND), 1309 new SSELogicalDecoder("andnpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_AND), 1310 new SSELogicalDecoder("orpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_OR), 1311 new SSELogicalDecoder("xorpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_XOR), 1312 /* 58 */ 1313 new SSEArithmeticDecoder("addpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_ADD), 1314 new SSEArithmeticDecoder("mulpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_SMUL), 1315 new SSEInstructionDecoder("cvtpd2ps", ADDR_V, ps_mode, ADDR_W, pd_mode), 1316 new SSEInstructionDecoder("cvtps2dq", ADDR_V, dq_mode, ADDR_W, ps_mode), 1317 new SSEArithmeticDecoder("subpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_SUB), 1318 new SSEInstructionDecoder("minpd", ADDR_V, pd_mode, ADDR_W, pd_mode), 1319 new SSEArithmeticDecoder("divpd", ADDR_V, pd_mode, ADDR_W, pd_mode, RTLOP_SDIV), 1320 new SSEInstructionDecoder("maxpd", ADDR_V, pd_mode, ADDR_W, pd_mode), 1321 /* 60 */ 1322 new SSEInstructionDecoder("punpcklbw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1323 new SSEInstructionDecoder("punpcklwd", ADDR_V, dq_mode, ADDR_W, dq_mode), 1324 new SSEInstructionDecoder("punpckldq", ADDR_V, dq_mode, ADDR_W, dq_mode), 1325 new SSEInstructionDecoder("packsswb", ADDR_V, dq_mode, ADDR_W, dq_mode), 1326 new SSEInstructionDecoder("pcmpgtb", ADDR_V, dq_mode, ADDR_W, dq_mode), 1327 new SSEInstructionDecoder("pcmpgtw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1328 new SSEInstructionDecoder("pcmpgtd", ADDR_V, dq_mode, ADDR_W, dq_mode), 1329 new SSEInstructionDecoder("packuswb", ADDR_V, dq_mode, ADDR_W, dq_mode), 1330 /* 68 */ 1331 new SSEInstructionDecoder("punpckhbw", ADDR_P, dq_mode, ADDR_Q, dq_mode), 1332 new SSEInstructionDecoder("punpckhwd", ADDR_P, dq_mode, ADDR_Q, dq_mode), 1333 new SSEInstructionDecoder("punpckhdq", ADDR_P, dq_mode, ADDR_Q, dq_mode), 1334 new SSEInstructionDecoder("packssdw", ADDR_P, dq_mode, ADDR_Q, dq_mode), 1335 new SSEInstructionDecoder("punpcklqdq", ADDR_V, dq_mode, ADDR_W, dq_mode), 1336 new SSEInstructionDecoder("punpckhqdq", ADDR_V, dq_mode, ADDR_W, dq_mode), 1337 new SSEMoveDecoder("movd", ADDR_V, dq_mode, ADDR_E, d_mode), 1338 new SSEMoveDecoder("movdqa", ADDR_V, dq_mode, ADDR_W, dq_mode), 1339 /* 70 */ 1340 new SSEInstructionDecoder("pshufd", ADDR_V, dq_mode, ADDR_W, dq_mode, ADDR_I, b_mode), 1341 new GRPDecoder(null, 22), 1342 new GRPDecoder(null, 23), 1343 new GRPDecoder(null, 24), 1344 new SSEInstructionDecoder("pcmpeqb", ADDR_V, dq_mode, ADDR_W, dq_mode), 1345 new SSEInstructionDecoder("pcmpeqw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1346 new SSEInstructionDecoder("pcmpeqd", ADDR_V, dq_mode, ADDR_W, dq_mode), 1347 null, 1348 /* 78 */ 1349 null, 1350 null, 1351 null, 1352 null, 1353 null, 1354 null, 1355 new SSEMoveDecoder("movd", ADDR_E, d_mode, ADDR_V, dq_mode), 1356 new SSEMoveDecoder("movdqa", ADDR_W, dq_mode, ADDR_V, dq_mode), 1357 /* 80 */ 1358 null, 1359 null, 1360 null, 1361 null, 1362 null, 1363 null, 1364 null, 1365 null, 1366 /* 88 */ 1367 null, 1368 null, 1369 null, 1370 null, 1371 null, 1372 null, 1373 null, 1374 null, 1375 /* 90 */ 1376 null, 1377 null, 1378 null, 1379 null, 1380 null, 1381 null, 1382 null, 1383 null, 1384 /* 98 */ 1385 null, 1386 null, 1387 null, 1388 null, 1389 null, 1390 null, 1391 null, 1392 null, 1393 /* a0 */ 1394 null, 1395 null, 1396 null, 1397 null, 1398 null, 1399 null, 1400 null, 1401 null, 1402 /* a8 */ 1403 null, 1404 null, 1405 null, 1406 null, 1407 null, 1408 null, 1409 null, 1410 null, 1411 /* b0 */ 1412 null, 1413 null, 1414 null, 1415 null, 1416 null, 1417 null, 1418 null, 1419 null, 1420 /* b8 */ 1421 null, 1422 null, 1423 null, 1424 null, 1425 null, 1426 null, 1427 null, 1428 null, 1429 /* c0 */ 1430 null, 1431 null, 1432 new SSEInstructionDecoder("cmppd", ADDR_V, pd_mode, ADDR_W, pd_mode, ADDR_I, b_mode), 1433 null, 1434 new SSEInstructionDecoder("pinsrw", ADDR_V, dq_mode, ADDR_E, d_mode, ADDR_I, b_mode), 1435 new SSEInstructionDecoder("pextrw", ADDR_G, d_mode, ADDR_V, dq_mode, ADDR_I, b_mode), 1436 new SSEInstructionDecoder("shufpd", ADDR_V, pd_mode, ADDR_W, pd_mode, ADDR_I, b_mode), 1437 null, 1438 /* c8 */ 1439 null, 1440 null, 1441 null, 1442 null, 1443 null, 1444 null, 1445 null, 1446 null, 1447 /* d0 */ 1448 null, 1449 new SSEShiftDecoder("psrlw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SRL), 1450 new SSEShiftDecoder("psrld", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SRL), 1451 new SSEShiftDecoder("psrlq", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SRL), 1452 new SSEArithmeticDecoder("paddq", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1453 new SSEArithmeticDecoder("pmullw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SMUL), 1454 new SSEMoveDecoder("movq", ADDR_W, q_mode, ADDR_V, q_mode), 1455 new SSEMoveDecoder("pmovmskb", ADDR_G, d_mode, ADDR_V, dq_mode), 1456 /* d8 */ 1457 new SSEArithmeticDecoder("psubusb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1458 new SSEArithmeticDecoder("psubusw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1459 new SSEInstructionDecoder("pminub", ADDR_V, dq_mode, ADDR_W, dq_mode), 1460 new SSELogicalDecoder("pand", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_AND), 1461 new SSEArithmeticDecoder("paddusb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1462 new SSEArithmeticDecoder("paddusw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1463 new SSEInstructionDecoder("pmaxub", ADDR_V, dq_mode, ADDR_W, dq_mode), 1464 new SSELogicalDecoder("pandn", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_AND), 1465 /* e0 */ 1466 new SSEInstructionDecoder("pavgb", ADDR_V, dq_mode, ADDR_W, dq_mode), 1467 new SSEInstructionDecoder("psraw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1468 new SSEInstructionDecoder("psrad", ADDR_V, dq_mode, ADDR_W, dq_mode), 1469 new SSEInstructionDecoder("pavgw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1470 new SSEArithmeticDecoder("pmulhuw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_UMUL), 1471 new SSEArithmeticDecoder("pmulhw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SMUL), 1472 new SSEInstructionDecoder("cvttpd2dq", ADDR_V, dq_mode, ADDR_W, pd_mode), 1473 new SSEMoveDecoder("movntdq", ADDR_W, dq_mode, ADDR_V, dq_mode), 1474 /* e8 */ 1475 new SSEArithmeticDecoder("psubusb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1476 new SSEArithmeticDecoder("psubusw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1477 new SSEInstructionDecoder("pminsw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1478 new SSELogicalDecoder("por", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_OR), 1479 new SSEArithmeticDecoder("paddsb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1480 new SSEArithmeticDecoder("paddsw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1481 new SSEInstructionDecoder("pmaxsw", ADDR_V, dq_mode, ADDR_W, dq_mode), 1482 new SSELogicalDecoder("pxor", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_XOR), 1483 /* f0 */ 1484 null, 1485 new SSEShiftDecoder("psllw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SLL), 1486 new SSEShiftDecoder("pslld", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SLL), 1487 new SSEShiftDecoder("psllq", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SLL), 1488 new SSEArithmeticDecoder("pmuludq", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_UMUL), 1489 new SSEArithmeticDecoder("pmaddwd", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1490 new SSEArithmeticDecoder("psadbw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1491 new SSEMoveDecoder("maskmovdqu", ADDR_V, dq_mode, ADDR_W, dq_mode), 1492 /* f8 */ 1493 new SSEArithmeticDecoder("psubb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1494 new SSEArithmeticDecoder("psubw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1495 new SSEArithmeticDecoder("psubd", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1496 new SSEArithmeticDecoder("psubq", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_SUB), 1497 new SSEArithmeticDecoder("paddb", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1498 new SSEArithmeticDecoder("paddw", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1499 new SSEArithmeticDecoder("paddd", ADDR_V, dq_mode, ADDR_W, dq_mode, RTLOP_ADD), 1500 null 1501 }; 1502 1503 public void decode(InstructionVisitor visitor) { 1504 int enter_instruction = 0; 1505 Instruction instr = null; 1506 visitor.prologue(); 1507 InstructionDecoder instrDecoder = null; 1508 try { 1509 byteIndex = 0; 1510 int len = 0; 1511 int instrStartIndex = 0; 1512 1513 while(len < code.length) { 1514 int prefixes = 0; 1515 instrStartIndex = byteIndex; 1516 1517 //check if there is any prefix 1518 prefixes = getPrefixes(); 1519 int segmentOverride = 1; //get segment override prefix 1520 1521 if (code[byteIndex] == 0xc8) 1522 enter_instruction = 1; 1523 else 1524 enter_instruction = 0; 1525 1526 //Read opcode 1527 int opcode = InstructionDecoder.readByte(code, byteIndex); 1528 byteIndex++; 1529 1530 if (opcode == 0x0f) { 1531 opcode = InstructionDecoder.readByte(code, byteIndex); 1532 byteIndex++; 1533 1534 //SSE: SSE instructions have reserved use of 0xF2, 0xF3, 0x66 prefixes 1535 if ((prefixes & PREFIX_REPNZ) != 0) { 1536 instrDecoder = twoBytePrefixF2Table[opcode]; 1537 } else if ((prefixes & PREFIX_REPZ) != 0) { 1538 instrDecoder = twoBytePrefixF3Table[opcode]; 1539 } else if ((prefixes & PREFIX_DATA) != 0) { 1540 instrDecoder = twoBytePrefix66Table[opcode]; 1541 } else { 1542 instrDecoder = twoByteTable[opcode]; 1543 } 1544 1545 } else { 1546 instrDecoder = oneByteTable[opcode]; 1547 } 1548 if (instrDecoder != null) { 1549 instr = instrDecoder.decode(code, byteIndex, instrStartIndex, segmentOverride, prefixes, factory); 1550 visitor.visit(startPc + len, instr); 1551 len = instrDecoder.getCurrentIndex(); 1552 } 1553 else { 1554 len += 1; 1555 } 1556 byteIndex = len; 1557 } 1558 } catch (Exception exp) { 1559 visitor.epilogue(); 1560 } 1561 } 1562 1563 private int getPrefixes() { 1564 int prefixByte = 0; 1565 int prefixes = 0; 1566 boolean isPrefix = true; 1567 while (isPrefix) { 1568 prefixByte = InstructionDecoder.readByte(code, byteIndex); 1569 1570 switch (prefixByte) { 1571 case 0xf3: 1572 prefixes |= PREFIX_REPZ; 1573 break; 1574 case 0xf2: 1575 prefixes |= PREFIX_REPNZ; 1576 break; 1577 case 0xf0: 1578 prefixes |= PREFIX_LOCK; 1579 break; 1580 case 0x2e: 1581 prefixes |= PREFIX_CS; 1582 break; 1583 case 0x36: 1584 prefixes |= PREFIX_SS; 1585 break; 1586 case 0x3e: 1587 prefixes |= PREFIX_DS; 1588 break; 1589 case 0x26: 1590 prefixes |= PREFIX_ES; 1591 break; 1592 case 0x64: 1593 prefixes |= PREFIX_FS; 1594 break; 1595 case 0x65: 1596 prefixes |= PREFIX_GS; 1597 break; 1598 case 0x66: 1599 prefixes |= PREFIX_DATA; 1600 break; 1601 case 0x67: 1602 prefixes |= PREFIX_ADR; 1603 break; 1604 case 0x9b: 1605 prefixes |= PREFIX_FWAIT; 1606 break; 1607 default: 1608 isPrefix = false; 1609 break; 1610 } 1611 if(isPrefix) 1612 byteIndex++; 1613 } 1614 return prefixes; 1615 } 1616 1617 }