view graal/com.oracle.max.asmdis/src/com/sun/max/asm/gen/cisc/ia32/OneByteOpcodeMap.java @ 3734:b55f2b8f83fd

Remove deprecated files.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sat, 17 Dec 2011 20:34:58 +0100
parents e233f5660da4
children
line wrap: on
line source

/*
 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.max.asm.gen.cisc.ia32;

import static com.sun.max.asm.gen.cisc.ia32.IA32ModRMGroup.*;
import static com.sun.max.asm.gen.cisc.x86.AddressingMethodCode.*;
import static com.sun.max.asm.gen.cisc.x86.HexByte.*;
import static com.sun.max.asm.gen.cisc.x86.OperandCode.*;
import static com.sun.max.asm.gen.cisc.x86.OperandTypeCode.*;
import static com.sun.max.asm.gen.cisc.x86.RegisterOperandCode.*;
import static com.sun.max.asm.gen.cisc.x86.X86Opcode.*;
import static com.sun.max.asm.ia32.IA32GeneralRegister16.*;
import static com.sun.max.asm.ia32.IA32GeneralRegister32.*;
import static com.sun.max.asm.ia32.IA32GeneralRegister8.*;
import static com.sun.max.asm.x86.SegmentRegister.*;

import com.sun.max.asm.gen.cisc.x86.*;
import com.sun.max.lang.*;

/**
 * Representation of the ...
 */
class OneByteOpcodeMap extends X86InstructionDescriptionCreator {

    private void create_low() {
        define(_00, "ADD", Eb, Gb);
        define(_01, "ADD", Ev, Gv);
        define(_02, "ADD", Gb, Eb);
        define(_03, "ADD", Gv, Ev);
        define(_04, "ADD", AL, Ib);
        define(_05, "ADD", eAX, Iv);
        define(_06, "PUSH", ES);
        define(_07, "POP", ES);

        define(_10, "ADC", Eb, Gb);
        define(_11, "ADC", Ev, Gv);
        define(_12, "ADC", Gb, Eb);
        define(_13, "ADC", Gv, Ev);
        define(_14, "ADC", AL, Ib);
        define(_15, "ADC", eAX, Iv);
        define(_16, "PUSH", SS);
        define(_17, "POP", SS);

        define(_20, "AND", Eb, Gb);
        define(_21, "AND", Ev, Gv);
        define(_22, "AND", Gb, Eb);
        define(_23, "AND", Gv, Ev);
        define(_24, "AND", AL, Ib);
        define(_25, "AND", eAX, Iv);
        define(SEG_ES, "SEG_ES").beNotExternallyTestable(); // prefix
        define(_27, "DAA");

        define(_30, "XOR", Eb, Gb);
        define(_31, "XOR", Ev, Gv);
        define(_32, "XOR", Gb, Eb);
        define(_33, "XOR", Gv, Ev);
        define(_34, "XOR", AL, Ib);
        define(_35, "XOR", eAX, Iv);
        define(SEG_SS, "SEG_SS").beNotExternallyTestable(); // prefix
        define(_37, "AAA");

        define(_40, "INC", Nv);

        define(_50, "PUSH", Nv);

        define(_60, "PUSHA").requireOperandSize(WordWidth.BITS_16).beNotExternallyTestable(); // gas does not emit the operand size prefix
        define(_60, "PUSHAD").requireOperandSize(WordWidth.BITS_32).setExternalName("pusha");
        define(_61, "POPA").requireOperandSize(WordWidth.BITS_16).beNotExternallyTestable(); // gas does not emit the operand size prefix
        define(_61, "POPAD").requireOperandSize(WordWidth.BITS_32).setExternalName("popa");
        define(_62, "BOUND", Gv, Ma).revertExternalOperandOrdering();
        define(_63, "ARPL", Ew, Gw);
        define(SEG_FS, "SEG_FS").beNotExternallyTestable(); // prefix
        define(SEG_GS, "SEG_GS").beNotExternallyTestable(); // prefix
        define(OPERAND_SIZE, "OPERAND_SIZE").beNotDisassemblable().beNotExternallyTestable(); // prefix
        define(ADDRESS_SIZE, "ADDRESS_SIZE").beNotDisassemblable().beNotExternallyTestable(); // prefix

        define(_70, "JO", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_71, "JNO", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_72, "JB", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_73, "JNB", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_74, "JZ", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_75, "JNZ", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_76, "JBE", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_77, "JNBE", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets

        define(_80, GROUP_1, b, Eb.excludeExternalTestArguments(AL), Ib);
        define(_81, GROUP_1, v, Ev.excludeExternalTestArguments(AX, EAX), Iv);
        define(_82, GROUP_1, b, Eb.excludeExternalTestArguments(AL), Ib);
        define(_83, GROUP_1, v, Ev, Ib).beNotExternallyTestable();
        define(_84, "TEST", Eb, Gb).revertExternalOperandOrdering();
        define(_85, "TEST", Ev, Gv).revertExternalOperandOrdering();
        define(_86, "XCHG", Eb, Gb);
        define(_87, "XCHG", Ev.excludeExternalTestArguments(AX, EAX), Gv.excludeExternalTestArguments(AX, EAX));

        define(_90, "NOP");
        define(_90, "XCHG", Nv.excludeDisassemblerTestArguments(AX, EAX), eAX);

        define(_A0, "MOV", AL, Ob);
        define(_A1, "MOV", eAX, Ov);
        define(_A2, "MOV", Ob, AL);
        define(_A3, "MOV", Ov, eAX);
        define(_A4, "MOVS", Yb, Xb);
        define(_A5, "MOVS", Yv, Xv);
        define(_A6, "CMPS", Yb, Xb);
        define(_A7, "CMPS", Yv, Xv);

        define(_B0, "MOV", Nb, Ib);

        define(_C0, GROUP_2, b, Eb, Ib);
        define(_C1, GROUP_2, v, Ev, Ib);
        define(_C2, "RET", Iw);
        define(_C3, "RET");
        define(_C4, "LES", Gv, Mp);
        define(_C5, "LDS", Gv, Mp);
        define(_C6, "MOV", b, Eb.excludeExternalTestArguments(AL, CL, DL, BL, AH, CH, DH, BH), Ib);
        define(_C7, "MOV", v, Ev.excludeExternalTestArguments(AX, CX, DX, BX, SP, BP, SI, DI, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI), Iv);

        define(_D0, GROUP_2, b, Eb, 1);
        define(_D1, GROUP_2, v, Ev, 1);
        define(_D2, GROUP_2, b, Eb, CL);
        define(_D3, GROUP_2, v, Ev, CL);
        define(_D4, "AAM", Ib.range(0, 0x7f));
        define(_D5, "AAD", Ib.range(0, 0x7f));
        define(_D6, "SALC").beNotExternallyTestable(); // missing in gas (undocumented by Intel)
        define(_D7, "XLAT");

        define(_E0, "LOOPNE", Jb);
        define(_E1, "LOOPE", Jb);
        define(_E2, "LOOP", Jb);
        define(_E3, "JCXZ", Jb).requireAddressSize(WordWidth.BITS_16);
        define(_E3, "JECXZ", Jb).requireAddressSize(WordWidth.BITS_32);
        define(_E4, "IN", AL, Ib);
        define(_E5, "IN", eAX, Ib);
        define(_E6, "OUT", Ib, AL);
        define(_E7, "OUT", Ib, eAX);

        define(LOCK, "LOCK").beNotExternallyTestable(); // prefix
        define(REPNE, "REPNE").beNotExternallyTestable(); // prefix
        define(REPE, "REPE").beNotExternallyTestable(); // prefix
        define(_F4, "HLT");
        define(_F5, "CMC");
        define(_F6, GROUP_3b, b);
        define(_F7, GROUP_3v, v);
    }

    private void create_high() {
        define(_08, "OR", Eb, Gb);
        define(_09, "OR", Ev, Gv);
        define(_0A, "OR", Gb, Eb);
        define(_0B, "OR", Gv, Ev);
        define(_0C, "OR", AL, Ib);
        define(_0D, "OR", eAX, Iv);
        define(_0E, "PUSH", CS);

        define(_18, "SBB", Eb, Gb);
        define(_19, "SBB", Ev, Gv);
        define(_1A, "SBB", Gb, Eb);
        define(_1B, "SBB", Gv, Ev);
        define(_1C, "SBB", AL, Ib);
        define(_1D, "SBB", eAX, Iv);
        define(_1E, "PUSH", DS);
        define(_1F, "POP", DS);

        define(_28, "SUB", Eb, Gb);
        define(_29, "SUB", Ev, Gv);
        define(_2A, "SUB", Gb, Eb);
        define(_2B, "SUB", Gv, Ev);
        define(_2C, "SUB", AL, Ib);
        define(_2D, "SUB", eAX, Iv);
        define(SEG_CS, "SEG_CS").beNotExternallyTestable(); // prefix
        define(_2F, "DAS");

        define(_38, "CMP", Eb, Gb);
        define(_39, "CMP", Ev, Gv);
        define(_3A, "CMP", Gb, Eb);
        define(_3B, "CMP", Gv, Ev);
        define(_3C, "CMP", AL, Ib);
        define(_3D, "CMP", eAX, Iv);
        define(SEG_DS, "SEG_DS").beNotExternallyTestable(); // prefix
        define(_3F, "AAS");

        define(_48, "DEC", Nv);

        define(_58, "POP", Nv);

        define(_68, "PUSH", Iv);
        define(_69, "IMUL", Gv, Ev, Iv);
        define(_6A, "PUSH", Ib.externalRange(0, 0x7f));
        define(_6B, "IMUL", Gv, Ev, Ib.externalRange(0, 0x7f));
        define(_6C, "INS", Yb);
        define(_6D, "INS", Yv);
        define(_6E, "OUTS", Xb);
        define(_6F, "OUTS", Xv);

        define(_78, "JS", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_79, "JNS", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7A, "JP", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7B, "JNP", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7C, "JL", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7D, "JNL", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7E, "JLE", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets
        define(_7F, "JNLE", Jb).beNotExternallyTestable(); // Darwin's gas always uses 16 bit offsets

        define(_88, "MOV", Eb, Gb.excludeExternalTestArguments(AL));
        define(_89, "MOV", Ev, Gv.excludeExternalTestArguments(AX, EAX));
        define(_8A, "MOV", Gb.excludeExternalTestArguments(AL), Eb);
        define(_8B, "MOV", Gv.excludeExternalTestArguments(AX, EAX), Ev);
        define(_8C, "MOV", Ew.excludeExternalTestArguments(AX, CX, DX, BX, SP, BP, SI, DI), Sw); // gas may needlessly insert OPERAND_SIZE prefix
        define(_8D, "LEA", Gv, M);
        define(_8E, "MOV", Sw, Ew.excludeExternalTestArguments(AX, CX, DX, BX, SP, BP, SI, DI)); // gas may needlessly insert OPERAND_SIZE prefix
        define(_8F, "POP", Ev.excludeExternalTestArguments(AX, CX, DX, BX, SP, BP, SI, DI, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI));

        define(_98, "CBW").requireOperandSize(WordWidth.BITS_16);
        define(_98, "CWDE").requireOperandSize(WordWidth.BITS_32);
        define(_99, "CWD").requireOperandSize(WordWidth.BITS_16);
        define(_99, "CDQ").requireOperandSize(WordWidth.BITS_32);
        define(_9A, "CALL", Ap);
        define(FWAIT, "FWAIT"); // 'wait' is a Java keyword, so we use the alternate mnemonic, which is more accurately named anyhow
        define(_9C, "PUSHF", v, Fv);
        define(_9D, "POPF", v, Fv);
        define(_9E, "SAHF");
        define(_9F, "LAHF");

        define(_A8, "TEST", AL, Ib);
        define(_A9, "TEST", eAX, Iv);
        define(_AA, "STOS", Yb);
        define(_AB, "STOS", Yv);
        define(_AC, "LODS", Xb);
        define(_AD, "LODS", Xv);
        define(_AE, "SCAS", Yb);
        define(_AF, "SCAS", Yv);

        define(_B8, "MOV", Nv, Iv);

        define(_C8, "ENTER", Iw, Ib).revertExternalOperandOrdering();
        define(_C9, "LEAVE");
        define(_CA, "RETF", Iw).beNotExternallyTestable(); // gas does not support segments
        define(_CB, "RETF").beNotExternallyTestable(); // gas does not support segments
        define(_CC, "INT", 3);
        define(_CD, "INTb", Ib).setExternalName("int"); // suffix "b" to avoid clashing with Java keyword "int"
        define(_CE, "INTO");
        define(_CF, "IRET");

        define(_D8, FP_D8);
        define(_D9, FP_D9);
        define(_DA, FP_DA);
        define(_DB, FP_DB);
        define(_DC, FP_DC);
        define(_DD, FP_DD);
        define(_DE, FP_DE);
        define(_DF, FP_DF);

        define(_E8, "CALL", Jv);
        define(_E9, "JMP", Jv);
        define(_EA, "JMP", Ap);
        define(_EB, "JMP", Jb).beNotExternallyTestable(); // Darwin's gas uses always uses a 16-bit offset
        define(_EC, "IN", AL, DX);
        define(_ED, "IN", eAX, DX);
        define(_EE, "OUT", DX, AL);
        define(_EF, "OUT", DX, eAX);

        define(_F8, "CLC");
        define(_F9, "STC");
        define(_FA, "CLI");
        define(_FB, "STI");
        define(_FC, "CLD");
        define(_FD, "STD");
        define(_FE, GROUP_4, b, Eb);
        define(_FF, GROUP_5);
    }

    OneByteOpcodeMap() {
        super(IA32Assembly.ASSEMBLY);
        create_low();
        create_high();
    }
}