hotspot/agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Disassembler.java
changeset 13903 eebf638312d2
parent 13902 6408a49a3a6b
parent 13901 4897299f395b
child 13905 12e9215f3daa
equal deleted inserted replaced
13902:6408a49a3a6b 13903:eebf638312d2
     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, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * 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 }