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 }