Search
lxdream.org :: lxdream/src/xlat/x86/x86op.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/xlat/x86/x86op.h
changeset 1011:fdd58619b760
prev1006:3a169c224c12
author nkeynes
date Sun Apr 12 07:24:45 2009 +0000 (15 years ago)
branchxlat-refactor
permissions -rw-r--r--
last change Restructure operand types -
rename to forms to avoid conflict for actual data types
temporary operands are now a first class form
remove explicit types for immediates - now implied by opcode
Initial work on promote-source-reg pass
file annotate diff log raw
nkeynes@991
     1
/**
nkeynes@991
     2
 * $Id$
nkeynes@991
     3
 * 
nkeynes@995
     4
 * x86/x86-64 Instruction generator
nkeynes@991
     5
 *
nkeynes@991
     6
 * Copyright (c) 2009 Nathan Keynes.
nkeynes@991
     7
 *
nkeynes@991
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@991
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@991
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@991
    11
 * (at your option) any later version.
nkeynes@991
    12
 *
nkeynes@991
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@991
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@991
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@991
    16
 * GNU General Public License for more details.
nkeynes@991
    17
 */
nkeynes@995
    18
nkeynes@995
    19
#ifndef lxdream_x86op_H
nkeynes@995
    20
#define lxdream_x86op_H
nkeynes@995
    21
nkeynes@991
    22
#include <stdint.h>
nkeynes@991
    23
#include <assert.h>
nkeynes@991
    24
nkeynes@991
    25
/******************************** Constants *****************************/
nkeynes@991
    26
nkeynes@991
    27
#define REG_NONE -1
nkeynes@991
    28
nkeynes@991
    29
/* 64-bit general-purpose regs */
nkeynes@991
    30
#define REG_RAX 0
nkeynes@991
    31
#define REG_RCX 1
nkeynes@991
    32
#define REG_RDX 2
nkeynes@991
    33
#define REG_RBX 3
nkeynes@991
    34
#define REG_RSP 4
nkeynes@991
    35
#define REG_RBP 5
nkeynes@991
    36
#define REG_RSI 6 
nkeynes@991
    37
#define REG_RDI 7
nkeynes@991
    38
#define REG_R8  8
nkeynes@991
    39
#define REG_R9  9
nkeynes@991
    40
#define REG_R10 10
nkeynes@991
    41
#define REG_R11 11
nkeynes@991
    42
#define REG_R12 12
nkeynes@991
    43
#define REG_R13 13
nkeynes@991
    44
#define REG_R14 14
nkeynes@991
    45
#define REG_R15 15
nkeynes@991
    46
nkeynes@991
    47
/* 32-bit general-purpose regs */
nkeynes@991
    48
#define REG_EAX  0
nkeynes@991
    49
#define REG_ECX  1
nkeynes@991
    50
#define REG_EDX  2
nkeynes@991
    51
#define REG_EBX  3
nkeynes@991
    52
#define REG_ESP  4
nkeynes@991
    53
#define REG_EBP  5
nkeynes@991
    54
#define REG_ESI  6 
nkeynes@991
    55
#define REG_EDI  7
nkeynes@991
    56
#define REG_R8D  8
nkeynes@991
    57
#define REG_R9D  9
nkeynes@991
    58
#define REG_R10D 10
nkeynes@991
    59
#define REG_R11D 11
nkeynes@991
    60
#define REG_R12D 12
nkeynes@991
    61
#define REG_R13D 13
nkeynes@991
    62
#define REG_R14D 14
nkeynes@991
    63
#define REG_R15D 15
nkeynes@991
    64
nkeynes@991
    65
/* 8-bit general-purpose regs (no-rex prefix) */
nkeynes@991
    66
#define REG_AL   0
nkeynes@991
    67
#define REG_CL   1
nkeynes@991
    68
#define REG_DL   2
nkeynes@991
    69
#define REG_BL   3
nkeynes@991
    70
#define REG_AH   4
nkeynes@991
    71
#define REG_CH   5
nkeynes@991
    72
#define REG_DH   6
nkeynes@991
    73
#define REG_BH   7
nkeynes@991
    74
nkeynes@991
    75
/* 8-bit general-purpose regs (rex-prefix) */
nkeynes@991
    76
#define REG_SPL  4
nkeynes@991
    77
#define REG_BPL  5
nkeynes@991
    78
#define REG_SIL  6
nkeynes@991
    79
#define REG_DIL  7
nkeynes@991
    80
#define REG_R8L  8
nkeynes@991
    81
#define REG_R9L  9
nkeynes@991
    82
#define REG_R10L 10
nkeynes@991
    83
#define REG_R11L 11
nkeynes@991
    84
#define REG_R12L 12
nkeynes@991
    85
#define REG_R13L 13
nkeynes@991
    86
#define REG_R14L 14
nkeynes@991
    87
#define REG_R15L 15
nkeynes@991
    88
nkeynes@991
    89
/* Condition flag variants */
nkeynes@991
    90
#define X86_COND_O   0x00  /* OF=1 */
nkeynes@991
    91
#define X86_COND_NO  0x01  /* OF=0 */
nkeynes@991
    92
#define X86_COND_B   0x02  /* CF=1 */
nkeynes@991
    93
#define X86_COND_C   0x02  /* CF=1 */
nkeynes@991
    94
#define X86_CONF_NAE 0x02  /* CF=1 */
nkeynes@991
    95
#define X86_COND_AE  0x03  /* CF=0 */
nkeynes@991
    96
#define X86_COND_NB  0x03  /* CF=0 */
nkeynes@991
    97
#define X86_COND_NC  0x03  /* CF=0 */
nkeynes@991
    98
#define X86_COND_E   0x04  /* ZF=1 */
nkeynes@991
    99
#define X86_COND_Z   0x04  /* ZF=1 */
nkeynes@991
   100
#define X86_COND_NE  0x05  /* ZF=0 */
nkeynes@991
   101
#define X86_COND_NZ  0x05  /* ZF=0 */
nkeynes@991
   102
#define X86_COND_BE  0x06  /* CF=1 || ZF=1 */
nkeynes@991
   103
#define X86_COND_NA  0x06  /* CF=1 || ZF=1 */
nkeynes@991
   104
#define X86_COND_A   0x07  /* CF=0 && ZF=0 */
nkeynes@991
   105
#define X86_COND_NBE 0x07  /* CF=0 && ZF=0 */
nkeynes@991
   106
#define X86_COND_S   0x08  /* SF=1 */
nkeynes@991
   107
#define X86_COND_NS  0x09  /* SF=0 */
nkeynes@991
   108
#define X86_COND_P   0x0A  /* PF=1 */
nkeynes@991
   109
#define X86_COND_PE  0x0A  /* PF=1 */
nkeynes@991
   110
#define X86_COND_NP  0x0B  /* PF=0 */
nkeynes@991
   111
#define X86_COND_PO  0x0B  /* PF=0 */
nkeynes@991
   112
#define X86_COND_L   0x0C  /* SF!=OF */
nkeynes@991
   113
#define X86_COND_NGE 0x0C  /* SF!=OF */
nkeynes@991
   114
#define X86_COND_GE  0x0D  /* SF=OF */
nkeynes@991
   115
#define X86_COND_NL  0x0D  /* SF=OF */
nkeynes@991
   116
#define X86_COND_LE  0x0E  /* ZF=1 || SF!=OF */
nkeynes@991
   117
#define X86_COND_NG  0x0E  /* ZF=1 || SF!=OF */
nkeynes@991
   118
#define X86_COND_G   0x0F  /* ZF=0 && SF=OF */
nkeynes@991
   119
#define X86_COND_NLE 0x0F  /* ZF=0 && SF=OF */
nkeynes@991
   120
nkeynes@991
   121
/* SSE floating pointer comparison variants */
nkeynes@991
   122
#define SSE_CMP_EQ    0x00
nkeynes@991
   123
#define SSE_CMP_LT    0x01
nkeynes@991
   124
#define SSE_CMP_LE    0x02
nkeynes@991
   125
#define SSE_CMP_UNORD 0x03
nkeynes@991
   126
#define SSE_CMP_NE    0x04
nkeynes@991
   127
#define SSE_CMP_NLT   0x05
nkeynes@991
   128
#define SSE_CMP_NLE   0x06
nkeynes@991
   129
#define SSE_CMP_ORD   0x07
nkeynes@991
   130
nkeynes@991
   131
/************************** Internal definitions ***************************/
nkeynes@991
   132
#define PREF_REXB 0x41
nkeynes@991
   133
#define PREF_REXX 0x42
nkeynes@991
   134
#define PREF_REXR 0x44
nkeynes@991
   135
#define PREF_REXW 0x48
nkeynes@991
   136
nkeynes@995
   137
/* PREF_REXW if required for pointer operations, otherwise 0 */
nkeynes@995
   138
#define PREF_PTR     ((sizeof(void *) == 8) ? PREF_REXW : 0) 
nkeynes@995
   139
nkeynes@991
   140
extern unsigned char *xlat_output;
nkeynes@991
   141
nkeynes@991
   142
#define OP(x) *xlat_output++ = (x)
nkeynes@991
   143
#define OP16(x) *((uint16_t *)xlat_output) = (x); xlat_output+=2
nkeynes@991
   144
#define OP32(x) *((uint32_t *)xlat_output) = (x); xlat_output+=4
nkeynes@991
   145
#define OP64(x) *((uint64_t *)xlat_output) = (x); xlat_output+=8
nkeynes@991
   146
#define OPPTR(x) *((void **)xlat_output) = ((void *)x); xlat_output+=(sizeof(void*))
nkeynes@991
   147
nkeynes@991
   148
/* Primary opcode emitter, eg OPCODE(0x0FBE) for MOVSX */
nkeynes@991
   149
#define OPCODE(x) if( (x) > 0xFFFF ) { OP(x>>16); OP((x>>8)&0xFF); OP(x&0xFF); } else if( (x) > 0xFF ) { OP(x>>8); OP(x&0xFF); } else { OP(x); }
nkeynes@991
   150
nkeynes@991
   151
/* Test if immediate value is representable as a signed 8-bit integer */
nkeynes@991
   152
#define IS_INT8(imm) ((imm) >= INT8_MIN && (imm) <= INT8_MAX)
nkeynes@991
   153
nkeynes@991
   154
/**
nkeynes@991
   155
 * Encode opcode+reg with no mod/rm (eg MOV imm64, r32)
nkeynes@991
   156
 */
nkeynes@991
   157
static void x86_encode_opcodereg( int rexw, uint32_t opcode, int reg )
nkeynes@991
   158
{
nkeynes@991
   159
    int rex = rexw;
nkeynes@991
   160
    reg &= 0x0F;
nkeynes@991
   161
    if( reg >= 8 ) {
nkeynes@991
   162
        rex |= PREF_REXB;
nkeynes@991
   163
        reg -= 8;
nkeynes@991
   164
    }
nkeynes@991
   165
    if( rex != 0 ) {
nkeynes@991
   166
        OP(rex);
nkeynes@991
   167
    }
nkeynes@991
   168
    OPCODE(opcode + reg);
nkeynes@991
   169
}
nkeynes@991
   170
nkeynes@991
   171
/**
nkeynes@991
   172
 * Encode opcode with mod/rm reg-reg operation.
nkeynes@991
   173
 * @param opcode primary instruction opcode
nkeynes@991
   174
 * @param rr reg field 
nkeynes@991
   175
 * @param rb r/m field
nkeynes@991
   176
 */
nkeynes@991
   177
static int x86_encode_reg_rm( int rexw, uint32_t opcode, int rr, int rb )
nkeynes@991
   178
{
nkeynes@991
   179
    int rex = rexw;
nkeynes@991
   180
    rr &= 0x0F;
nkeynes@991
   181
    rb &= 0x0F;
nkeynes@991
   182
    if( rr >= 8 ) {
nkeynes@991
   183
        rex |= PREF_REXR;
nkeynes@991
   184
        rr -= 8;
nkeynes@991
   185
    }
nkeynes@991
   186
    if( rb >= 8 ) {
nkeynes@991
   187
        rex |= PREF_REXB;
nkeynes@991
   188
        rb -= 8;
nkeynes@991
   189
    }
nkeynes@991
   190
    if( rex != 0 ) {
nkeynes@991
   191
        OP(rex);
nkeynes@991
   192
    }
nkeynes@991
   193
    OPCODE(opcode);
nkeynes@991
   194
    OP(0xC0|(rr<<3)|rb);
nkeynes@991
   195
}
nkeynes@991
   196
nkeynes@991
   197
/**
nkeynes@991
   198
 * Encode opcode + 32-bit mod/rm memory address. (RIP-relative not supported here)
nkeynes@991
   199
 * @param rexw REX.W prefix is required, otherwise 0
nkeynes@991
   200
 * @param rr Reg-field register (required). 
nkeynes@991
   201
 * @param rb Base (unscaled) register, or -1 for no base register. 
nkeynes@991
   202
 * @param rx Index (scaled) register, or -1 for no index register
nkeynes@991
   203
 * @param ss Scale shift (0..3) applied to index register (ignored if no index register)
nkeynes@991
   204
 * @param disp32 Signed displacement (0 for none)
nkeynes@991
   205
 */ 
nkeynes@991
   206
static void x86_encode_modrm( int rexw, uint32_t opcode, int rr, int rb, int rx, int ss, int32_t disp32 )
nkeynes@991
   207
{
nkeynes@991
   208
    /* Construct the rex prefix where necessary */
nkeynes@991
   209
    int rex = rexw;
nkeynes@991
   210
    rr &= 0x0F;
nkeynes@991
   211
    if( rr >= 8 ) {
nkeynes@991
   212
        rex |= PREF_REXR;
nkeynes@991
   213
        rr -= 8;
nkeynes@991
   214
    }
nkeynes@991
   215
    if( rb != -1 ) {
nkeynes@991
   216
        rb &= 0x0F;
nkeynes@991
   217
        if( rb >= 8 ) {
nkeynes@991
   218
            rex |= PREF_REXB;
nkeynes@991
   219
            rb -= 8;
nkeynes@991
   220
        }
nkeynes@991
   221
    }
nkeynes@991
   222
    if( rx != -1 ) {
nkeynes@991
   223
        rx &= 0x0F;
nkeynes@991
   224
        if( rx >= 8 ) {
nkeynes@991
   225
            rex |= PREF_REXX;
nkeynes@991
   226
            rx -= 8;
nkeynes@991
   227
        }
nkeynes@991
   228
    }
nkeynes@991
   229
    
nkeynes@991
   230
    if( rex != 0 ) {
nkeynes@991
   231
        OP(rex);
nkeynes@991
   232
    }
nkeynes@991
   233
    OPCODE(opcode);
nkeynes@991
   234
    
nkeynes@991
   235
    if( rx == -1 ) {
nkeynes@991
   236
        if( rb == -1 ) {
nkeynes@991
   237
            /* [disp32] displacement only - use SIB form for 64-bit mode safety */
nkeynes@991
   238
            OP(0x04|(rr<<3));
nkeynes@991
   239
            OP(0x25);
nkeynes@991
   240
            OP32(disp32);
nkeynes@991
   241
        } else if( rb == REG_ESP ) { /* [%esp + disp32] - SIB is mandatory for %esp/%r12 encodings */
nkeynes@991
   242
            if( disp32 == 0 ) {
nkeynes@991
   243
                OP(0x04|(rr<<3));
nkeynes@991
   244
                OP(0x24);
nkeynes@991
   245
            } else if( IS_INT8(disp32) ) {
nkeynes@991
   246
                OP(0x44|(rr<<3));
nkeynes@991
   247
                OP(0x24);
nkeynes@991
   248
                OP((int8_t)disp32);
nkeynes@991
   249
            } else {
nkeynes@991
   250
                OP(0x84|(rr<<3));
nkeynes@991
   251
                OP(0x24);
nkeynes@991
   252
                OP32(disp32);
nkeynes@991
   253
            }
nkeynes@991
   254
        } else {
nkeynes@991
   255
            if( disp32 == 0 && rb != REG_EBP ) { /* [%ebp] is encoded as [%ebp+0] */
nkeynes@991
   256
                OP((rr<<3)|rb);
nkeynes@991
   257
            } else if( IS_INT8(disp32) ) {
nkeynes@991
   258
                OP(0x40|(rr<<3)|rb);
nkeynes@991
   259
                OP((int8_t)disp32);
nkeynes@991
   260
            } else {
nkeynes@991
   261
                OP(0x80|(rr<<3)|rb);
nkeynes@991
   262
                OP32(disp32);
nkeynes@991
   263
            }
nkeynes@991
   264
        }
nkeynes@991
   265
    } else { /* We have a scaled index. Goody */
nkeynes@991
   266
        assert( ((rx != REG_ESP) || (rex&PREF_REXX)) && "Bug: attempt to index through %esp" ); /* Indexing by %esp is impossible */
nkeynes@991
   267
        if( rb == -1 ) { /* [disp32 + rx << ss] */
nkeynes@991
   268
            OP(0x04|(rr<<3));
nkeynes@991
   269
            OP(0x05|(ss<<6)|(rx<<3));
nkeynes@991
   270
            OP32(disp32);
nkeynes@991
   271
        } else if( disp32 == 0 && rb != REG_EBP ) { /* [rb + rx << ss]. (Again, %ebp needs to be %ebp+0) */
nkeynes@991
   272
            OP(0x04|(rr<<3));
nkeynes@991
   273
            OP((ss<<6)|(rx<<3)|rb);
nkeynes@991
   274
        } else if( IS_INT8(disp32) ) {
nkeynes@991
   275
            OP(0x44|(rr<<3));
nkeynes@991
   276
            OP((ss<<6)|(rx<<3)|rb);
nkeynes@991
   277
            OP((int8_t)disp32);
nkeynes@991
   278
        } else {
nkeynes@991
   279
            OP(0x84|(rr<<3));
nkeynes@991
   280
            OP((ss<<6)|(rx<<3)|rb);
nkeynes@991
   281
            OP32(disp32);
nkeynes@991
   282
        }
nkeynes@991
   283
    }
nkeynes@991
   284
}
nkeynes@991
   285
nkeynes@991
   286
/**
nkeynes@991
   287
 * Encode opcode + RIP-relative mod/rm (64-bit mode only)
nkeynes@991
   288
 * @param rexw PREF_REXW or 0
nkeynes@991
   289
 * @param opcode primary instruction opcode
nkeynes@991
   290
 * @param rr mod/rm reg field
nkeynes@991
   291
 * @param disp32 RIP-relative displacement
nkeynes@991
   292
 */
nkeynes@991
   293
static void x86_encode_modrm_rip(int rexw, uint32_t opcode, int rr, int32_t disp32)
nkeynes@991
   294
{
nkeynes@991
   295
    int rex = rexw;
nkeynes@991
   296
    rr &= 0x0F;
nkeynes@991
   297
    if( rr >= 8 ) {
nkeynes@991
   298
        rex |= PREF_REXR;
nkeynes@991
   299
        rr -= 8;
nkeynes@991
   300
    }
nkeynes@991
   301
    if( rex != 0 ) {
nkeynes@991
   302
        OP(rex);
nkeynes@991
   303
    }
nkeynes@991
   304
    OPCODE(opcode);
nkeynes@991
   305
    OP(0x05|(rr<<3));
nkeynes@991
   306
    OP32(disp32);
nkeynes@991
   307
}
nkeynes@991
   308
nkeynes@991
   309
/* 32/64-bit op emitters. 64-bit versions include a rex.w prefix. Note that any
nkeynes@991
   310
 * other prefixes (mandatory or otherwise) need to be emitted prior to these 
nkeynes@991
   311
 * functions
nkeynes@991
   312
 */ 
nkeynes@991
   313
#define x86_encode_opcode64(opcode,reg) x86_encode_opcodereg(PREF_REXW, opcode,reg)
nkeynes@991
   314
#define x86_encode_opcode32(opcode,reg) x86_encode_opcodereg(0,opcode,reg)
nkeynes@991
   315
#define x86_encode_r32_rm32(opcode,rr,rb) x86_encode_reg_rm(0,opcode,rr,rb)
nkeynes@991
   316
#define x86_encode_r64_rm64(opcode,rr,rb) x86_encode_reg_rm(PREF_REXW,opcode,rr,rb)
nkeynes@991
   317
#define x86_encode_r32_mem32(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(0,opcode,rr,rb,rx,ss,disp32)
nkeynes@991
   318
#define x86_encode_r64_mem64(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,rb,rx,ss,disp32)
nkeynes@995
   319
#define x86_encode_rptr_memptr(opcode,rr,rb,rx,ss,disp32) x86_encode_modrm(PREF_PTR,opcode,rr,rb,rx,ss,disp32)
nkeynes@1011
   320
#define x86_encode_r32_r32disp32(opcode,rr,rb,disp32) x86_encode_modrm(0,opcode,rr,rb,-1,0,disp32)
nkeynes@1011
   321
#define x86_encode_r64_r64disp32(opcode,rr,rb,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,rb,-1,0,disp32)
nkeynes@991
   322
#define x86_encode_r32_ripdisp32(opcode,rr,disp32) x86_encode_modrm_rip(0,opcode,rr,disp32)
nkeynes@991
   323
#define x86_encode_r64_ripdisp64(opcode,rr,disp32) x86_encode_modrm_rip(PREF_REXW,opcode,rr,disp32)
nkeynes@991
   324
nkeynes@991
   325
/* Convenience versions for the common rbp/rsp relative displacements */
nkeynes@991
   326
#define x86_encode_r32_rbpdisp32(opcode,rr,disp32) x86_encode_modrm(0,opcode,rr,REG_RBP,-1,0,disp32)
nkeynes@1011
   327
#define x86_encode_r64_rbpdisp32(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RBP,-1,0,disp32)
nkeynes@991
   328
#define x86_encode_r32_rspdisp32(opcode,rr,disp32) x86_encode_modrm(0,opcode,rr,REG_RSP,-1,0,disp32)
nkeynes@1011
   329
#define x86_encode_r64_rspdisp32(opcode,rr,disp32) x86_encode_modrm(PREF_REXW,opcode,rr,REG_RSP,-1,0,disp32)
nkeynes@991
   330
nkeynes@991
   331
/* Immediate-selection variants (for instructions with imm8s/imm32 variants) */
nkeynes@991
   332
#define x86_encode_imms_rm32(opcode8,opcode32,reg,imm,rb) \
nkeynes@991
   333
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_rm32(opcode8,reg,rb); OP((int8_t)imm); \
nkeynes@991
   334
                } else { x86_encode_r32_rm32(opcode32,reg,rb); OP32(imm); }
nkeynes@991
   335
#define x86_encode_imms_rm64(opcode8,opcode32,reg,imm,rb) \
nkeynes@991
   336
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_r64_rm64(opcode8,reg,rb); OP((int8_t)imm); \
nkeynes@991
   337
                } else { x86_encode_r64_rm64(opcode32,reg,rb); OP32(imm); }
nkeynes@995
   338
#define x86_encode_imms_rmptr(opcode8,opcode32,reg,imm,rb) \
nkeynes@995
   339
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_reg_rm( PREF_PTR, opcode8,reg,rb); OP((int8_t)imm); \
nkeynes@995
   340
                } else { x86_encode_reg_rm( PREF_PTR, opcode32,reg,rb); OP32(imm); }
nkeynes@991
   341
#define x86_encode_imms_rbpdisp32(opcode8,opcode32,reg,imm,disp) \
nkeynes@991
   342
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_rbpdisp32(opcode8,reg,disp); OP((int8_t)imm); \
nkeynes@991
   343
                } else { x86_encode_r32_rbpdisp32(opcode32,reg,disp); OP32(imm); }
nkeynes@991
   344
#define x86_encode_imms_r32disp32(opcode8,opcode32,reg,imm,rb,disp) \
nkeynes@1011
   345
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_r32_r32disp32(opcode8,reg,rb,disp); OP((int8_t)imm); \
nkeynes@1011
   346
                } else { x86_encode_r32_r32disp32(opcode32,reg,rb,disp); OP32(imm); }
nkeynes@1011
   347
#define x86_encode_imms_r64disp32(opcode8,opcode32,reg,imm,rb,disp) \
nkeynes@1011
   348
    if( IS_INT8(((int32_t)imm)) ) { x86_encode_r64_r64disp32(opcode8,reg,rb,disp); OP((int8_t)imm); \
nkeynes@1011
   349
                } else { x86_encode_r64_r64disp32(opcode32,reg,rb,disp); OP32(imm); }
nkeynes@991
   350
nkeynes@991
   351
/*************************** Instruction definitions ***********************/
nkeynes@991
   352
/* Note this does not try to be an exhaustive definition of the instruction -
nkeynes@991
   353
 * it generally only has the forms that we actually need here.
nkeynes@991
   354
 */
nkeynes@991
   355
/* Core Integer instructions */
nkeynes@991
   356
#define ADCB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 2, r1); OP(imm)
nkeynes@991
   357
#define ADCB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x10, r1, r2)
nkeynes@991
   358
#define ADCL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 2, imm, r1)
nkeynes@1011
   359
#define ADCL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83, 0x81, 2, imm, rb, d)
nkeynes@991
   360
#define ADCL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83, 0x81, 2, imm, disp)
nkeynes@991
   361
#define ADCL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x11, r1, r2)
nkeynes@1011
   362
#define ADCL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x11, r1, rb, d)
nkeynes@991
   363
#define ADCL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x11, r1, disp)
nkeynes@1011
   364
#define ADCL_r32disp_r32(rb,disp,r1) x86_encode_r32_r32disp32(0x13, r1, rb, disp)
nkeynes@991
   365
#define ADCL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x13, r1, disp)
nkeynes@991
   366
#define ADCQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 2, imm, r1)
nkeynes@991
   367
#define ADCQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x11, r1, r2)
nkeynes@991
   368
nkeynes@991
   369
#define ADDB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 0, r1); OP(imm)
nkeynes@991
   370
#define ADDB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x00, r1, r2)
nkeynes@991
   371
#define ADDL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 0, imm, r1)
nkeynes@991
   372
#define ADDL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83, 0x81, 0, imm, rb, d)
nkeynes@991
   373
#define ADDL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83, 0x81, 0, imm, disp)
nkeynes@991
   374
#define ADDL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x01, r1, r2)
nkeynes@1011
   375
#define ADDL_r32_r32disp(r1,r2,dsp)  x86_encode_r32_r32disp32(0x01, r1, r2, dsp)
nkeynes@991
   376
#define ADDL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x01, r1, disp)
nkeynes@1011
   377
#define ADDL_r32disp_r32(rb,disp,r1) x86_encode_r32_r32disp32(0x03, r1, rb, disp)
nkeynes@991
   378
#define ADDL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x03, r1, disp)
nkeynes@991
   379
#define ADDQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 0, imm, r1)
nkeynes@991
   380
#define ADDQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x01, r1, r2)
nkeynes@991
   381
nkeynes@991
   382
#define ANDB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 4, r1); OP(imm)
nkeynes@991
   383
#define ANDB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x20, r1, r2)
nkeynes@991
   384
#define ANDL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 4, imm, r1)
nkeynes@1011
   385
#define ANDL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83,0x81,4,imm,rb,d)
nkeynes@991
   386
#define ANDL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83,0x81,4,imm,disp)
nkeynes@991
   387
#define ANDL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x21, r1, r2)
nkeynes@1011
   388
#define ANDL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x21, r1, rb, d)
nkeynes@991
   389
#define ANDL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x21, r1, disp)
nkeynes@1011
   390
#define ANDL_r32disp_r32(rb,d,r1)    x86_encode_r32_r32disp32(0x23, r1, rb, d)
nkeynes@991
   391
#define ANDL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x23, r1, disp)
nkeynes@991
   392
#define ANDQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x21, r1, r2)
nkeynes@991
   393
#define ANDQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 4, imm, r1)
nkeynes@995
   394
#define ANDP_imms_rptr(imm,r1)       x86_encode_imms_rmptr(0x83, 0x81, 4, imm, r1)       
nkeynes@991
   395
nkeynes@1006
   396
#define BSWAPL_r32(r1)                x86_encode_opcode32(0x0FC8, r1)
nkeynes@1006
   397
#define BSWAPQ_r64(r2)                x86_encode_opcode64(0x0FC8, r1)
nkeynes@1006
   398
nkeynes@991
   399
#define CLC()                        OP(0xF8)
nkeynes@991
   400
#define CLD()                        OP(0xFC)
nkeynes@991
   401
#define CMC()                        OP(0xF5)
nkeynes@991
   402
nkeynes@1011
   403
#define CMOVCCL_cc_r32_r32(cc,r1,r2)       x86_encode_r32_rm32(0x0F40+(cc), r2, r1)
nkeynes@1011
   404
#define CMOVCCL_cc_r32disp_r32(cc,rb,d,r1) x86_encode_r32_r32disp32(0x0F40+(cc), r1, rb, d)
nkeynes@1011
   405
#define CMOVCCL_cc_rbpdisp_r32(cc,d,r1)    x86_encode_r32_rbpdisp32(0x0F40+(cc), r1, d)
nkeynes@991
   406
nkeynes@991
   407
#define CMPB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 7, r1); OP(imm)
nkeynes@1011
   408
#define CMPB_imms_r32disp(imm,rb,d)  x86_encode_r32_r32disp32(0x80, 7, rb, d); OP(imm)
nkeynes@991
   409
#define CMPB_imms_rbpdisp(imm,disp)  x86_encode_r32_rbpdisp32(0x80, 7, disp); OP(imm)
nkeynes@991
   410
#define CMPB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x38, r1, r2)
nkeynes@991
   411
#define CMPL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 7, imm, r1)
nkeynes@1011
   412
#define CMPL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83, 0x81, 7, imm, rb, d)
nkeynes@991
   413
#define CMPL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83, 0x81, 7, imm, disp)
nkeynes@991
   414
#define CMPL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x39, r1, r2)
nkeynes@1011
   415
#define CMPL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x39, r1, rb, d)
nkeynes@991
   416
#define CMPL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x39, r1, disp)
nkeynes@1011
   417
#define CMPL_r32disp_r32(rb,d,r1)    x86_encode_r32_r32disp32(0x3B, r1, rb, d)
nkeynes@991
   418
#define CMPL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x3B, r1, disp)
nkeynes@991
   419
#define CMPQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 7, imm, r1)
nkeynes@991
   420
#define CMPQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x39, r1, r2)
nkeynes@991
   421
nkeynes@1006
   422
#define CDQL()                       OP(0x99)
nkeynes@1006
   423
#define CDOQ()                       OP(PREF_REXW); OP(0x99)
nkeynes@1006
   424
nkeynes@1006
   425
#define DECL_r32(r1)                 x86_encode_r32_rm32(0xFF,1,r1) /* NB single-op form unavailable in 64-bit mode */
nkeynes@1011
   426
#define DECL_r32disp(rb,d)           x86_encode_r32_r32disp32(0xFF,1,rb,d)
nkeynes@1006
   427
#define DECL_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xFF,1,disp)
nkeynes@1006
   428
#define DECQ_r64(r1)                 x86_encode_r64_rm64(0xFF,1,r1)
nkeynes@1011
   429
#define DECQ_r64disp(rb,d)           x86_encode_r64_r64disp32(0xFF,1,rb,d)
nkeynes@1011
   430
#define DECQ_rbpdisp(disp)           x86_encode_r64_rbpdisp32(0xFF,1,disp)
nkeynes@1006
   431
nkeynes@991
   432
#define IDIVL_r32(r1)                x86_encode_r32_rm32(0xF7, 7, r1)
nkeynes@1011
   433
#define IDIVL_r32disp(rb,d)          x86_encode_r32_r32disp32(0xF7, 7, rb, d)
nkeynes@991
   434
#define IDIVL_rbpdisp(disp)          x86_encode_r32_rbpdisp32(0xF7, 7, disp)
nkeynes@991
   435
#define IDIVQ_r64(r1)                x86_encode_r64_rm64(0xF7, 7, r1)
nkeynes@991
   436
nkeynes@991
   437
#define IMULL_imms_r32(imm,r1)       x86_encode_imms_rm32(0x6B,0x69, r1, imm, r1)
nkeynes@991
   438
#define IMULL_r32(r1)                x86_encode_r32_rm32(0xF7, 5, r1)
nkeynes@991
   439
#define IMULL_r32_r32(r1,r2)         x86_encode_r32_rm32(0x0FAF, r2, r1)
nkeynes@1011
   440
#define IMULL_r32disp(rb,d)          x86_encode_r32_r32disp32(0xF7, 5, rb, d)
nkeynes@1011
   441
#define IMULL_r32disp_r32(rb,d,r1)   x86_encode_r32_r32disp32(0x0FAF, r1, rb, d)
nkeynes@991
   442
#define IMULL_rbpdisp(disp)          x86_encode_r32_rbpdisp32(0xF7, 5, disp)
nkeynes@991
   443
#define IMULL_rbpdisp_r32(disp,r1)   x86_encode_r32_rbpdisp32(0x0FAF, r1, disp)
nkeynes@991
   444
#define IMULL_rspdisp(disp)          x86_encode_r32_rspdisp32(0xF7, 5, disp)
nkeynes@991
   445
#define IMULL_rspdisp_r32(disp,r1)   x86_encode_r32_rspdisp32(0x0FAF, r1, disp)
nkeynes@991
   446
#define IMULQ_imms_r64(imm,r1)       x86_encode_imms_rm64(0x6B,0x69, r1, imm, r1)
nkeynes@991
   447
#define IMULQ_r64_r64(r1,r2)         x86_encode_r64_rm64(0x0FAF, r2, r1)
nkeynes@1011
   448
#define IMULQ_r64disp_r64(rb,d,r1)   x86_encode_r64_r64disp32(0x0FAF, r1, rb, d)
nkeynes@1011
   449
#define IMULQ_rbpdisp_r64(disp,r1)   x86_encode_r64_rbpdisp32(0x0FAF, r1, disp)
nkeynes@1006
   450
nkeynes@1006
   451
#define INCL_r32(r1)                 x86_encode_r32_rm32(0xFF,0,r1) /* NB single-op form unavailable in 64-bit mode */
nkeynes@1011
   452
#define INCL_r32disp(rb,d)           x86_encode_r32_r32disp32(0xFF,0,rb,d)
nkeynes@1006
   453
#define INCL_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xFF,0,disp)
nkeynes@1006
   454
#define INCQ_r64(r1)                 x86_encode_r64_rm64(0xFF,0,r1)
nkeynes@1011
   455
#define INCQ_r64disp(rb,d)           x86_encode_r64_r64disp32(0xFF,0,rb,d)
nkeynes@1011
   456
#define INCQ_rbpdisp(disp)           x86_encode_r64_rbpdisp32(0xFF,0,disp)
nkeynes@991
   457
nkeynes@991
   458
#define LEAL_r32disp_r32(r1,disp,r2) x86_encode_r32_mem32(0x8D, r2, r1, -1, 0, disp)
nkeynes@991
   459
#define LEAL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x8D, r1, disp)
nkeynes@991
   460
#define LEAL_sib_r32(ss,ii,bb,d,r1)  x86_encode_r32_mem32(0x8D, r1, bb, ii, ss, d)
nkeynes@1011
   461
#define LEAQ_r64disp_r64(r1,disp,r2) x86_encode_r64_r64disp32(0x8D, r2, r1, disp)
nkeynes@1011
   462
#define LEAQ_rbpdisp_r64(disp,r1)    x86_encode_r64_rbpdisp32(0x8D, r1, disp)
nkeynes@991
   463
#define LEAP_rptrdisp_rptr(r1,d,r2)  x86_encode_rptr_memptr(0x8D, r2, r1, -1, 0, disp)
nkeynes@991
   464
#define LEAP_rbpdisp_rptr(disp,r1)   x86_encode_rptr_memptr(0x8D, r1, REG_RBP, -1, 0, disp)
nkeynes@991
   465
#define LEAP_sib_rptr(ss,ii,bb,d,r1) x86_encode_rptr_memptr(0x8D, r1, bb, ii, ss, d)
nkeynes@991
   466
nkeynes@991
   467
#define MOVB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x88, r1, r2)
nkeynes@991
   468
#define MOVL_imm32_r32(i32,r1)       x86_encode_opcode32(0xB8, r1); OP32(i32)
nkeynes@1011
   469
#define MOVL_imm32_r32disp(i,rb,d)   x86_encode_r32_r32disp32(0xC7,0,rb,d); OP32(i)
nkeynes@991
   470
#define MOVL_imm32_rbpdisp(i,disp)   x86_encode_r32_rbpdisp32(0xC7,0,disp); OP32(i)
nkeynes@991
   471
#define MOVL_imm32_rspdisp(i,disp)   x86_encode_r32_rspdisp32(0xC7,0,disp); OP32(i)
nkeynes@991
   472
#define MOVL_moffptr_eax(p)          OP(0xA1); OPPTR(p)
nkeynes@991
   473
#define MOVL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x89, r1, r2)
nkeynes@1011
   474
#define MOVL_r32_r32disp(r1,r2,dsp)  x86_encode_r32_r32disp32(0x89, r1, r2, dsp)
nkeynes@991
   475
#define MOVL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x89, r1, disp)
nkeynes@991
   476
#define MOVL_r32_rspdisp(r1,disp)    x86_encode_r32_rspdisp32(0x89, r1, disp)
nkeynes@991
   477
#define MOVL_r32_sib(r1,ss,ii,bb,d)  x86_encode_r32_mem32(0x89, r1, bb, ii, ss, d)
nkeynes@1011
   478
#define MOVL_r32disp_r32(r1,dsp,r2)  x86_encode_r32_r32disp32(0x8B, r2, r1, dsp)
nkeynes@991
   479
#define MOVL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x8B, r1, disp)
nkeynes@991
   480
#define MOVL_rspdisp_r32(disp,r1)    x86_encode_r32_rspdisp32(0x8B, r1, disp)
nkeynes@991
   481
#define MOVL_sib_r32(ss,ii,bb,d,r1)  x86_encode_r32_mem32(0x8B, r1, bb, ii, ss, d)
nkeynes@991
   482
#define MOVQ_imm64_r64(i64,r1)       x86_encode_opcode64(0xB8, r1); OP64(i64)
nkeynes@991
   483
#define MOVQ_moffptr_rax(p)          OP(PREF_REXW); OP(0xA1); OPPTR(p)
nkeynes@991
   484
#define MOVQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x89, r1, r2)
nkeynes@1011
   485
#define MOVQ_r64_r64disp(r1,rb,d)    x86_encode_r64_r64disp32(0x89, r1, rb, d)
nkeynes@1011
   486
#define MOVQ_r64_rbpdisp(r1,disp)    x86_encode_r64_rbpdisp32(0x89, r1, disp)
nkeynes@1011
   487
#define MOVQ_r64_rspdisp(r1,disp)    x86_encode_r64_rspdisp32(0x89, r1, disp)
nkeynes@1011
   488
#define MOVQ_r64disp_r64(rb,d,r1)    x86_encode_r64_r64disp32(0x8B, r1, rb, d)
nkeynes@1011
   489
#define MOVQ_rbpdisp_r64(disp,r1)    x86_encode_r64_rbpdisp32(0x8B, r1, disp)
nkeynes@1011
   490
#define MOVQ_rspdisp_r64(disp,r1)    x86_encode_r64_rspdisp32(0x8B, r1, disp)
nkeynes@995
   491
#define MOVP_immptr_rptr(p,r1)       x86_encode_opcodereg( PREF_PTR, 0xB8, r1); OPPTR(p)
nkeynes@991
   492
#define MOVP_moffptr_rax(p)          if( sizeof(void*)==8 ) { OP(PREF_REXW); } OP(0xA1); OPPTR(p)
nkeynes@995
   493
#define MOVP_rptr_rptr(r1,r2)        x86_encode_reg_rm(PREF_PTR, 0x89, r1, r2)
nkeynes@991
   494
#define MOVP_sib_rptr(ss,ii,bb,d,r1) x86_encode_rptr_memptr(0x8B, r1, bb, ii, ss, d)
nkeynes@991
   495
nkeynes@991
   496
#define MOVSXL_r8_r32(r1,r2)         x86_encode_r32_rm32(0x0FBE, r2, r1)
nkeynes@991
   497
#define MOVSXL_r16_r32(r1,r2)        x86_encode_r32_rm32(0x0FBF, r2, r1)
nkeynes@1011
   498
#define MOVSXL_r32disp8_r32(r,d,r1)  x86_encode_r32_r32disp32(0x0FBE, r1, r, d) 
nkeynes@1011
   499
#define MOVSXL_r32disp16_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FBF, r1, r, d) 
nkeynes@991
   500
#define MOVSXL_rbpdisp8_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0FBE, r1, disp) 
nkeynes@991
   501
#define MOVSXL_rbpdisp16_r32(dsp,r1) x86_encode_r32_rbpdisp32(0x0FBF, r1, dsp) 
nkeynes@991
   502
#define MOVSXQ_imm32_r64(i32,r1)     x86_encode_r64_rm64(0xC7, 0, r1); OP32(i32) /* Technically a MOV */
nkeynes@991
   503
#define MOVSXQ_r8_r64(r1,r2)         x86_encode_r64_rm64(0x0FBE, r2, r1)
nkeynes@991
   504
#define MOVSXQ_r16_r64(r1,r2)        x86_encode_r64_rm64(0x0FBF, r2, r1)
nkeynes@991
   505
#define MOVSXQ_r32_r64(r1,r2)        x86_encode_r64_rm64(0x63, r2, r1)
nkeynes@1011
   506
#define MOVSXQ_r64disp32_r64(r,d,r1) x86_encode_r64_r64disp32(0x63, r1, r, d)
nkeynes@1011
   507
#define MOVSXQ_rbpdisp32_r64(dsp,r1) x86_encode_r64_rbpdisp32(0x63, r1, dsp)
nkeynes@991
   508
nkeynes@991
   509
#define MOVZXL_r8_r32(r1,r2)         x86_encode_r32_rm32(0x0FB6, r2, r1)
nkeynes@991
   510
#define MOVZXL_r16_r32(r1,r2)        x86_encode_r32_rm32(0x0FB7, r2, r1)
nkeynes@1011
   511
#define MOVZXL_r32disp8_r32(r,d,r1)  x86_encode_r32_r32disp32(0x0FB6, r1, r, d)
nkeynes@1011
   512
#define MOVZXL_r32disp16_r32(r,d,r1) x86_encode_r32_r32disp32(0x0FB7, r1, r, d)
nkeynes@991
   513
#define MOVZXL_rbpdisp8_r32(disp,r1) x86_encode_r32_rbpdisp32(0x0FB6, r1, disp)
nkeynes@991
   514
#define MOVZXL_rbpdisp16_r32(dsp,r1) x86_encode_r32_rbpdisp32(0x0FB7, r1, dsp)
nkeynes@991
   515
nkeynes@991
   516
#define MULL_r32(r1)                 x86_encode_r32_rm32(0xF7, 4, r1)
nkeynes@1011
   517
#define MULL_r32disp(rb,d)           x86_encode_r32_r32disp32(0xF7,4,rb,d)
nkeynes@991
   518
#define MULL_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xF7,4,disp)
nkeynes@991
   519
#define MULL_rspdisp(disp)           x86_encode_r32_rspdisp32(0xF7,4,disp)
nkeynes@991
   520
nkeynes@991
   521
#define NEGB_r8(r1)                  x86_encode_r32_rm32(0xF6, 3, r1)
nkeynes@991
   522
#define NEGL_r32(r1)                 x86_encode_r32_rm32(0xF7, 3, r1)
nkeynes@1011
   523
#define NEGL_r32disp(rb,d)           x86_encode_r32_r32disp32(0xF7, 3, rb, d)
nkeynes@1006
   524
#define NEGL_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xF7, 3, disp)
nkeynes@991
   525
#define NEGQ_r64(r1)                 x86_encode_r64_rm64(0xF7, 3, r1)
nkeynes@991
   526
nkeynes@991
   527
#define NOTB_r8(r1)                  x86_encode_r32_rm32(0xF6, 2, r1)
nkeynes@991
   528
#define NOTL_r32(r1)                 x86_encode_r32_rm32(0xF7, 2, r1)
nkeynes@1011
   529
#define NOTL_r32disp(rb,d)           x86_encode_r32_r32disp32(0xF7, 2, rb, d)
nkeynes@1006
   530
#define NOTL_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xF7, 2, disp)
nkeynes@991
   531
#define NOTQ_r64(r1)                 x86_encode_r64_rm64(0xF7, 2, r1)
nkeynes@991
   532
nkeynes@991
   533
#define ORB_imms_r8(imm,r1)          x86_encode_r32_rm32(0x80, 1, r1); OP(imm)
nkeynes@991
   534
#define ORB_r8_r8(r1,r2)             x86_encode_r32_rm32(0x08, r1, r2)
nkeynes@991
   535
#define ORL_imms_r32(imm,r1)         x86_encode_imms_rm32(0x83, 0x81, 1, imm, r1)
nkeynes@1011
   536
#define ORL_imms_r32disp(imm,rb,d)   x86_encode_imms_r32disp32(0x83,0x81,1,imm,rb,d)
nkeynes@991
   537
#define ORL_imms_rbpdisp(imm,disp)   x86_encode_imms_rbpdisp32(0x83,0x81,1,imm,disp)
nkeynes@991
   538
#define ORL_r32_r32(r1,r2)           x86_encode_r32_rm32(0x09, r1, r2)
nkeynes@1011
   539
#define ORL_r32_r32disp(r1,rb,d)     x86_encode_r32_r32disp32(0x09, r1, rb, d)
nkeynes@991
   540
#define ORL_r32_rbpdisp(r1,disp)     x86_encode_r32_rbpdisp32(0x09, r1, disp)
nkeynes@1011
   541
#define ORL_r32disp_r32(rb,d,r1)     x86_encode_r32_r32disp32(0x0B, r1, rb, d)
nkeynes@991
   542
#define ORL_rbpdisp_r32(disp,r1)     x86_encode_r32_rbpdisp32(0x0B, r1, disp)
nkeynes@991
   543
#define ORQ_imms_r64(imm,r1)         x86_encode_imms_rm64(0x83, 0x81, 1, imm, r1)
nkeynes@991
   544
#define ORQ_r64_r64(r1,r2)           x86_encode_r64_rm64(0x09, r1, r2)
nkeynes@991
   545
nkeynes@991
   546
#define POP_r32(r1)                  x86_encode_opcode32(0x58, r1)
nkeynes@991
   547
nkeynes@991
   548
#define PUSH_imm32(imm)              OP(0x68); OP32(imm)
nkeynes@991
   549
#define PUSH_r32(r1)                 x86_encode_opcode32(0x50, r1)
nkeynes@991
   550
nkeynes@991
   551
#define RCLL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,2,r1)
nkeynes@1011
   552
#define RCLL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,2,rb,d)
nkeynes@991
   553
#define RCLL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,2,r1); } else { x86_encode_r32_rm32(0xC1,2,r1); OP(imm); }
nkeynes@1011
   554
#define RCLL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,2,rb,d); } else { x86_encode_r32_r32disp32(0xC1,2,rb,d); OP(imm); }
nkeynes@991
   555
#define RCLQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,2,r1)
nkeynes@1011
   556
#define RCLQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,2,rb,d)
nkeynes@991
   557
#define RCLQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,2,r1); } else { x86_encode_r64_rm64(0xC1,2,r1); OP(imm); }
nkeynes@1011
   558
#define RCLQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,2,rb,d); } else { x86_encode_r64_r64disp32(0xC1,2,rb,d); OP(imm); }
nkeynes@1006
   559
nkeynes@991
   560
#define RCRL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,3,r1)
nkeynes@1011
   561
#define RCRL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,3,rb,d)
nkeynes@991
   562
#define RCRL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,3,r1); } else { x86_encode_r32_rm32(0xC1,3,r1); OP(imm); }
nkeynes@1011
   563
#define RCRL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,3,rb,d); } else { x86_encode_r32_r32disp32(0xC1,3,rb,d); OP(imm); }
nkeynes@991
   564
#define RCRQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,3,r1)
nkeynes@1011
   565
#define RCRQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,3,rb,d)
nkeynes@991
   566
#define RCRQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,3,r1); } else { x86_encode_r64_rm64(0xC1,3,r1); OP(imm); }
nkeynes@1011
   567
#define RCRQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,3,rb,d); } else { x86_encode_r64_r64disp32(0xC1,3,rb,d); OP(imm); }
nkeynes@1006
   568
nkeynes@991
   569
#define ROLL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,0,r1)
nkeynes@1011
   570
#define ROLL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,0,rb,d)
nkeynes@991
   571
#define ROLL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,0,r1); } else { x86_encode_r32_rm32(0xC1,0,r1); OP(imm); }
nkeynes@1011
   572
#define ROLL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,0,rb,d); } else { x86_encode_r32_r32disp32(0xC1,0,rb,d); OP(imm); }
nkeynes@991
   573
#define ROLQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,0,r1)
nkeynes@1011
   574
#define ROLQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,0,rb,d)
nkeynes@991
   575
#define ROLQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,0,r1); } else { x86_encode_r64_rm64(0xC1,0,r1); OP(imm); }
nkeynes@1011
   576
#define ROLQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,0,rb,d); } else { x86_encode_r64_r64disp32(0xC1,0,rb,d); OP(imm); }
nkeynes@1006
   577
nkeynes@991
   578
#define RORL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,1,r1)
nkeynes@1011
   579
#define RORL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,1,rb,d)
nkeynes@991
   580
#define RORL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,1,r1); } else { x86_encode_r32_rm32(0xC1,1,r1); OP(imm); }
nkeynes@1011
   581
#define RORL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,1,rb,d); } else { x86_encode_r32_r32disp32(0xC1,1,rb,d); OP(imm); }
nkeynes@991
   582
#define RORQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,1,r1)
nkeynes@1011
   583
#define RORQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,1,rb,d)
nkeynes@991
   584
#define RORQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,1,r1); } else { x86_encode_r64_rm64(0xC1,1,r1); OP(imm); }
nkeynes@1011
   585
#define RORQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,1,rb,d); } else { x86_encode_r64_r64disp32(0xC1,1,rb,d); OP(imm); }
nkeynes@991
   586
nkeynes@991
   587
#define SARL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,7,r1)
nkeynes@1011
   588
#define SARL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,7,rb,d)
nkeynes@991
   589
#define SARL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,7,r1); } else { x86_encode_r32_rm32(0xC1,7,r1); OP(imm); }
nkeynes@1011
   590
#define SARL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,7,rb,d); } else { x86_encode_r32_r32disp32(0xC1,7,rb,d); OP(imm); }
nkeynes@991
   591
#define SARQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,7,r1)
nkeynes@1011
   592
#define SARQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,7,rb,d)
nkeynes@991
   593
#define SARQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,7,r1); } else { x86_encode_r64_rm64(0xC1,7,r1); OP(imm); }
nkeynes@1011
   594
#define SARQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,7,rb,d); } else { x86_encode_r64_r64disp32(0xC1,7,rb,d); OP(imm); }
nkeynes@1006
   595
nkeynes@991
   596
#define SHLL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,4,r1)
nkeynes@1011
   597
#define SHLL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,4,rb,d)
nkeynes@991
   598
#define SHLL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,4,r1); } else { x86_encode_r32_rm32(0xC1,4,r1); OP(imm); }
nkeynes@1011
   599
#define SHLL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,4,rb,d); } else { x86_encode_r32_r32disp32(0xC1,4,rb,d); OP(imm); }
nkeynes@991
   600
#define SHLQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,4,r1)
nkeynes@1011
   601
#define SHLQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,4,rb,d)
nkeynes@991
   602
#define SHLQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,4,r1); } else { x86_encode_r64_rm64(0xC1,4,r1); OP(imm); }
nkeynes@1011
   603
#define SHLQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,4,rb,d); } else { x86_encode_r64_r64disp32(0xC1,4,rb,d); OP(imm); }
nkeynes@1006
   604
nkeynes@1006
   605
#define SHLDL_cl_r32_r32(r1,r2)      x86_encode_r32_rm32(0x0FA5,r1,r2)
nkeynes@1011
   606
#define SHLDL_cl_r32_r32disp(r1,d)   x86_encode_r32_r32disp32(0x0FA5,r1,d)
nkeynes@1006
   607
#define SHLDL_imm_r32_r32(imm,r1,r2) x86_encode_r32_rm32(0x0FA4,r1,r2); OP(imm)
nkeynes@1011
   608
#define SHLDL_imm_r32_r32disp(i,r,d) x86_encode_r32_r32disp32(0x0FA4,r,d); OP(imm) 
nkeynes@1006
   609
#define SHLDQ_cl_r64_r64(r1,r2)      x86_encode_r64_rm64(0x0FA5,r1,r2)
nkeynes@1011
   610
#define SHLDQ_cl_r64_r64disp(r1,d)   x86_encode_r64_r64disp32(0x0FA5,r1,d)
nkeynes@1006
   611
#define SHLDQ_imm_r64_r64(imm,r1,r2) x86_encode_r64_rm64(0x0FA4,r1,r2); OP(imm)
nkeynes@1011
   612
#define SHLDQ_imm_r64_r64disp(i,r,d) x86_encode_r64_r64disp32(0x0FA4,r,d); OP(imm) 
nkeynes@1006
   613
nkeynes@991
   614
#define SHRL_cl_r32(r1)              x86_encode_r32_rm32(0xD3,5,r1)
nkeynes@1011
   615
#define SHRL_cl_r32disp(rb,d)        x86_encode_r32_r32disp32(0xD3,5,rb,d)
nkeynes@991
   616
#define SHRL_imm_r32(imm,r1)         if( imm == 1 ) { x86_encode_r32_rm32(0xD1,5,r1); } else { x86_encode_r32_rm32(0xC1,5,r1); OP(imm); }
nkeynes@1011
   617
#define SHRL_imm_r32disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r32_r32disp32(0xD1,5,rb,d); } else { x86_encode_r32_r32disp32(0xC1,5,rb,d); OP(imm); }
nkeynes@991
   618
#define SHRQ_cl_r64(r1)              x86_encode_r64_rm64(0xD3,5,r1)
nkeynes@1011
   619
#define SHRQ_cl_r64disp(rb,d)        x86_encode_r64_r64disp32(0xD3,5,rb,d)
nkeynes@991
   620
#define SHRQ_imm_r64(imm,r1)         if( imm == 1 ) { x86_encode_r64_rm64(0xD1,5,r1); } else { x86_encode_r64_rm64(0xC1,5,r1); OP(imm); }
nkeynes@1011
   621
#define SHRQ_imm_r64disp(imm,rb,d)   if( imm == 1 ) { x86_encode_r64_r64disp32(0xD1,5,rb,d); } else { x86_encode_r64_r64disp32(0xC1,5,rb,d); OP(imm); }
nkeynes@1006
   622
nkeynes@1011
   623
#define SHRDL_cl_r32_r32(r1,r2)         x86_encode_r32_rm32(0x0FAD,r1,r2)
nkeynes@1011
   624
#define SHRDL_cl_r32_r32disp(r1,rb,d)   x86_encode_r32_r32disp32(0x0FAD,r1,rb,d)
nkeynes@1011
   625
#define SHRDL_imm_r32_r32(imm,r1,r2)    x86_encode_r32_rm32(0x0FAC,r1,r2); OP(imm)
nkeynes@1011
   626
#define SHRDL_imm_r32_r32disp(i,r,rb,d) x86_encode_r32_r32disp32(0x0FAC,r,rb,d); OP(imm) 
nkeynes@1011
   627
#define SHRDQ_cl_r64_r64(r1,r2)         x86_encode_r64_rm64(0x0FAD,r1,r2)
nkeynes@1011
   628
#define SHRDQ_cl_r64_r64disp(r1,rb,d)   x86_encode_r64_r64disp32(0x0FAD,r1,rb,d)
nkeynes@1011
   629
#define SHRDQ_imm_r64_r64(imm,r1,r2)    x86_encode_r64_rm64(0x0FAC,r1,r2); OP(imm)
nkeynes@1011
   630
#define SHRDQ_imm_r64_r64disp(i,r,rb,d) x86_encode_r64_r64disp32(0x0FAC,r,rb,d); OP(imm) 
nkeynes@991
   631
nkeynes@991
   632
#define SBBB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 3, r1); OP(imm)
nkeynes@991
   633
#define SBBB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x18, r1, r2)
nkeynes@991
   634
#define SBBL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 3, imm, r1)
nkeynes@1011
   635
#define SBBL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83,0x81,3,imm,rb,d)
nkeynes@991
   636
#define SBBL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83,0x81,3,imm,disp)
nkeynes@991
   637
#define SBBL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x19, r1, r2)
nkeynes@1011
   638
#define SBBL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x19, r1, rb,d)
nkeynes@991
   639
#define SBBL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x19, r1, disp)
nkeynes@1011
   640
#define SBBL_r32disp_r32(rb,d,r1)    x86_encode_r32_r32disp32(0x1B, r1, rb,d)
nkeynes@991
   641
#define SBBL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x1B, r1, disp)
nkeynes@991
   642
#define SBBQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 3, imm, r1)
nkeynes@991
   643
#define SBBQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x19, r1, r2)
nkeynes@991
   644
nkeynes@991
   645
#define SETCCB_cc_r8(cc,r1)          x86_encode_r32_rm32(0x0F90+(cc), 0, r1)
nkeynes@1011
   646
#define SETCCB_cc_r32disp(cc,rb,d)   x86_encode_r32_r32disp32(0x0F90+(cc), 0, rb, d)
nkeynes@991
   647
#define SETCCB_cc_rbpdisp(cc,disp)   x86_encode_r32_rbpdisp32(0x0F90+(cc), 0, disp)
nkeynes@991
   648
nkeynes@991
   649
#define STC()                        OP(0xF9)
nkeynes@991
   650
#define STD()                        OP(0xFD)
nkeynes@991
   651
nkeynes@991
   652
#define SUBB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 5, r1); OP(imm)
nkeynes@991
   653
#define SUBB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x28, r1, r2)
nkeynes@991
   654
#define SUBL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 5, imm, r1)
nkeynes@1011
   655
#define SUBL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83,0x81,5,imm,rb,d)
nkeynes@991
   656
#define SUBL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83,0x81,5,imm,disp)
nkeynes@991
   657
#define SUBL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x29, r1, r2)
nkeynes@1011
   658
#define SUBL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x29, r1, rb, d)
nkeynes@991
   659
#define SUBL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x29, r1, disp)
nkeynes@1011
   660
#define SUBL_r32disp_r32(rb,d,r1)    x86_encode_r32_r32disp32(0x2B, r1, rb, d)
nkeynes@991
   661
#define SUBL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x2B, r1, disp)
nkeynes@991
   662
#define SUBQ_imms_r64(imm,r1)        x86_encode_imms_rm64(0x83, 0x81, 5, imm, r1)
nkeynes@991
   663
#define SUBQ_r64_r64(r1,r2)          x86_encode_r64_rm64(0x29, r1, r2)
nkeynes@991
   664
nkeynes@991
   665
#define TESTB_imms_r8(imm,r1)        x86_encode_r32_rm32(0xF6, 0, r1); OP(imm)
nkeynes@991
   666
#define TESTB_r8_r8(r1,r2)           x86_encode_r32_rm32(0x84, r1, r2)
nkeynes@991
   667
#define TESTL_imms_r32(imm,r1)       x86_encode_r32_rm32(0xF7, 0, r1); OP32(imm)
nkeynes@1011
   668
#define TESTL_imms_r32disp(imm,r,d)  x86_encode_r32_r32disp32(0xF7, 0, r, d); OP32(imm)
nkeynes@991
   669
#define TESTL_imms_rbpdisp(imm,dsp)  x86_encode_r32_rbpdisp32(0xF7, 0, dsp); OP32(imm)
nkeynes@991
   670
#define TESTL_r32_r32(r1,r2)         x86_encode_r32_rm32(0x85, r1, r2)
nkeynes@1011
   671
#define TESTL_r32_r32disp(r1,rb,d)   x86_encode_r32_r32disp32(0x85, r1, rb, d)
nkeynes@991
   672
#define TESTL_r32_rbpdisp(r1,disp)   x86_encode_r32_rbpdisp32(0x85, r1, disp)
nkeynes@1011
   673
#define TESTL_r32disp_r32(rb,d,r1)   x86_encode_r32_r32disp32(0x85, r1, rb, d) /* Same OP */
nkeynes@991
   674
#define TESTL_rbpdisp_r32(disp,r1)   x86_encode_r32_rbpdisp32(0x85, r1, disp) /* Same OP */
nkeynes@991
   675
#define TESTQ_imms_r64(imm,r1)       x86_encode_r64_rm64(0xF7, 0, r1); OP32(imm)
nkeynes@991
   676
#define TESTQ_r64_r64(r1,r2)         x86_encode_r64_rm64(0x85, r1, r2)
nkeynes@991
   677
nkeynes@991
   678
#define XCHGB_r8_r8(r1,r2)           x86_encode_r32_rm32(0x86, r1, r2)
nkeynes@991
   679
#define XCHGL_r32_r32(r1,r2)         x86_encode_r32_rm32(0x87, r1, r2)
nkeynes@991
   680
#define XCHGQ_r64_r64(r1,r2)         x86_encode_r64_rm64(0x87, r1, r2)
nkeynes@991
   681
nkeynes@991
   682
#define XORB_imms_r8(imm,r1)         x86_encode_r32_rm32(0x80, 6, r1); OP(imm)
nkeynes@991
   683
#define XORB_r8_r8(r1,r2)            x86_encode_r32_rm32(0x30, r1, r2)
nkeynes@991
   684
#define XORL_imms_r32(imm,r1)        x86_encode_imms_rm32(0x83, 0x81, 6, imm, r1)
nkeynes@1011
   685
#define XORL_imms_r32disp(imm,rb,d)  x86_encode_imms_r32disp32(0x83,0x81,6,imm,rb,d)
nkeynes@991
   686
#define XORL_imms_rbpdisp(imm,disp)  x86_encode_imms_rbpdisp32(0x83,0x81,6,imm,disp)
nkeynes@991
   687
#define XORL_r32_r32(r1,r2)          x86_encode_r32_rm32(0x31, r1, r2)
nkeynes@1011
   688
#define XORL_r32_r32disp(r1,rb,d)    x86_encode_r32_r32disp32(0x31, r1, rb, d)
nkeynes@991
   689
#define XORL_r32_rbpdisp(r1,disp)    x86_encode_r32_rbpdisp32(0x31, r1, disp)
nkeynes@1011
   690
#define XORL_r32disp_r32(rb,d,r1)    x86_encode_r32_r32disp32(0x33, r1, rb, d)
nkeynes@991
   691
#define XORL_rbpdisp_r32(disp,r1)    x86_encode_r32_rbpdisp32(0x33, r1, disp)
nkeynes@991
   692
#define XORQ_imms_r64(imm,r1)         x86_encode_imms_rm64(0x83, 0x81, 6, imm, r1)
nkeynes@991
   693
#define XORQ_r64_r64(r1,r2)           x86_encode_r64_rm64(0x31, r1, r2)
nkeynes@991
   694
nkeynes@991
   695
/* Control flow */
nkeynes@991
   696
#define CALL_rel(rel)                OP(0xE8); OP32(rel)
nkeynes@1011
   697
#define CALL_imm32(ptr)              x86_encode_r32_r32disp32(0xFF, 2, -1, ptr)
nkeynes@991
   698
#define CALL_r32(r1)                 x86_encode_r32_rm32(0xFF, 2, r1)
nkeynes@1011
   699
#define CALL_r32disp(r1,disp)        x86_encode_r32_r32disp32(0xFF, 2, r1, disp)
nkeynes@1006
   700
#define CALL_sib(ss,ii,bb,disp)      x86_encode_r32_mem32(0xFF, 2, bb, ii, ss, disp)
nkeynes@991
   701
nkeynes@991
   702
#define JCC_cc_rel8(cc,rel)          OP(0x70+(cc)); OP(rel)
nkeynes@991
   703
#define JCC_cc_rel32(cc,rel)         OP(0x0F); OP(0x80+(cc)); OP32(rel)
nkeynes@991
   704
#define JCC_cc_rel(cc,rel)           if( IS_INT8(rel) ) { JCC_cc_rel8(cc,(int8_t)rel); } else { JCC_cc_rel32(cc,rel); }
nkeynes@991
   705
nkeynes@991
   706
#define JMP_rel8(rel)                OP(0xEB); OP(rel)
nkeynes@991
   707
#define JMP_rel32(rel)               OP(0xE9); OP32(rel)
nkeynes@991
   708
#define JMP_rel(rel)                 if( IS_INT8(rel) ) { JMP_rel8((int8_t)rel); } else { JMP_rel32(rel); }
nkeynes@991
   709
#define JMP_prerel(rel)              if( IS_INT8(((int32_t)rel)-2) ) { JMP_rel8(((int8_t)rel)-2); } else { JMP_rel32(((int32_t)rel)-5); }
nkeynes@991
   710
#define JMP_r32(r1,disp)             x86_encode_r32_rm32(0xFF, 4, r1)
nkeynes@1011
   711
#define JMP_r32disp(r1,disp)         x86_encode_r32_r32disp32(0xFF, 4, r1, disp)
nkeynes@991
   712
#define RET()                        OP(0xC3)
nkeynes@991
   713
#define RET_imm(imm)                 OP(0xC2); OP16(imm)
nkeynes@991
   714
nkeynes@1006
   715
/* Labeled jumps for automated backpatching of forward jumps (rel8 only) */
nkeynes@1006
   716
#define _MARK_JMP8(x) uint8_t *_mark_jmp_##x = (xlat_output-1)
nkeynes@1006
   717
#define JMP_TARGET(x) *_mark_jmp_##x += (xlat_output - _mark_jmp_##x)
nkeynes@1006
   718
#define JCC_cc_label(cc,label) JCC_cc_rel8(cc,-1); _MARK_JMP8(label)
nkeynes@1006
   719
#define JMP_label(label) JMP_rel8(-1); _MARK_JMP8(label)
nkeynes@1006
   720
#define JAE_label(label) JCC_cc_label(X86_COND_AE,label)
nkeynes@1006
   721
#define JE_label(label)  JCC_cc_label(X86_COND_E,label)
nkeynes@1006
   722
#define JG_label(label)  JCC_cc_label(X86_COND_G,label)
nkeynes@1006
   723
#define JGE_label(label) JCC_cc_label(X86_COND_GE,label)
nkeynes@1006
   724
#define JNA_label(label) JCC_cc_label(X86_COND_NA,label)
nkeynes@1006
   725
#define JNE_label(label) JCC_cc_label(X86_COND_NE,label)
nkeynes@1006
   726
#define JNGE_label(label) JCC_cc_label(X86_COND_NGE,label)
nkeynes@1006
   727
#define JNO_label(label) JCC_cc_label(X86_COND_NO,label)
nkeynes@1006
   728
#define JS_label(label)  JCC_cc_label(X86_COND_S,label)
nkeynes@991
   729
nkeynes@991
   730
/* x87 Floating point instructions */
nkeynes@991
   731
#define FABS_st0()                   OP(0xD9); OP(0xE1)
nkeynes@991
   732
#define FADDP_st(st)                 OP(0xDE); OP(0xC0+(st))
nkeynes@991
   733
#define FCHS_st0()                   OP(0xD9); OP(0xE0)
nkeynes@991
   734
#define FCOMIP_st(st)                OP(0xDF); OP(0xF0+(st))
nkeynes@991
   735
#define FDIVP_st(st)                 OP(0xDE); OP(0xF8+(st))
nkeynes@1011
   736
#define FILD_r32disp(r32, disp)      x86_encode_r32_r32disp32(0xDB, 0, r32, disp)
nkeynes@991
   737
#define FLD0_st0()                   OP(0xD9); OP(0xEE);
nkeynes@991
   738
#define FLD1_st0()                   OP(0xD9); OP(0xE8);
nkeynes@1011
   739
#define FLDCW_r32disp(r32, disp)     x86_encode_r32_r32disp32(0xD9, 5, r32, disp)
nkeynes@991
   740
#define FMULP_st(st)                 OP(0xDE); OP(0xC8+(st))
nkeynes@1011
   741
#define FNSTCW_r32disp(r32, disp)    x86_encode_r32_r32disp32(0xD9, 7, r32, disp)
nkeynes@991
   742
#define FPOP_st()                    OP(0xDD); OP(0xC0); OP(0xD9); OP(0xF7)
nkeynes@991
   743
#define FSUBP_st(st)                 OP(0xDE); OP(0xE8+(st))
nkeynes@991
   744
#define FSQRT_st0()                  OP(0xD9); OP(0xFA)
nkeynes@991
   745
nkeynes@991
   746
#define FILD_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xDB, 0, disp)
nkeynes@991
   747
#define FLDF_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xD9, 0, disp)
nkeynes@991
   748
#define FLDD_rbpdisp(disp)           x86_encode_r32_rbpdisp32(0xDD, 0, disp)
nkeynes@991
   749
#define FISTP_rbpdisp(disp)          x86_encode_r32_rbpdisp32(0xDB, 3, disp)
nkeynes@991
   750
#define FSTPF_rbpdisp(disp)          x86_encode_r32_rbpdisp32(0xD9, 3, disp)
nkeynes@991
   751
#define FSTPD_rbpdisp(disp)          x86_encode_r32_rbpdisp32(0xDD, 3, disp)
nkeynes@991
   752
nkeynes@991
   753
nkeynes@1006
   754
/* SSE Integer instructions */
nkeynes@1006
   755
#define MOVL_r32_xmm(r1,r2)          OP(0x66); x86_encode_r32_rm32(0x0F6E, r2, r1)
nkeynes@1006
   756
#define MOVL_xmm_r32(r1,r2)          OP(0x66); x86_encode_r32_rm32(0x0F7E, r1, r2)
nkeynes@1006
   757
#define MOVQ_r64_xmm(r1,r2)          OP(0x66); x86_encode_r64_rm64(0x0F6E, r2, r1)
nkeynes@1006
   758
#define MOVQ_xmm_r64(r1,r2)          OP(0x66); x86_encode_r64_rm64(0x0F7E, r1, r2)
nkeynes@1006
   759
nkeynes@991
   760
/* SSE Packed floating point instructions */
nkeynes@1011
   761
#define ADDPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F58, r1, rb,d)
nkeynes@991
   762
#define ADDPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F58, r2, r1)
nkeynes@1011
   763
#define ANDPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F54, r1, rb,d)
nkeynes@991
   764
#define ANDPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F54, r2, r1)
nkeynes@1011
   765
#define ANDNPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F55, r1, rb,d)
nkeynes@991
   766
#define ANDNPS_xmm_xmm(r1,r2)        x86_encode_r32_rm32(0x0F55, r2, r1)
nkeynes@1011
   767
#define CMPPS_cc_r32disp_xmm(cc,rb,d,r) x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)
nkeynes@991
   768
#define CMPPS_cc_xmm_xmm(cc,r1,r2)   x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)
nkeynes@1011
   769
#define DIVPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)
nkeynes@991
   770
#define DIVPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F5E, r2, r1)
nkeynes@1011
   771
#define MAXPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)
nkeynes@991
   772
#define MAXPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F5F, r2, r1)
nkeynes@1011
   773
#define MINPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)
nkeynes@991
   774
#define MINPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F5D, r2, r1)
nkeynes@991
   775
#define MOV_xmm_xmm(r1,r2)           x86_encode_r32_rm32(0x0F28, r2, r1)
nkeynes@1011
   776
#define MOVAPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F28, r1, rb,d)
nkeynes@1011
   777
#define MOVAPS_xmm_r32disp(r1,rb,d)  x86_encode_r32_r32disp32(0x0F29, r1, rb,d)
nkeynes@991
   778
#define MOVHLPS_xmm_xmm(r1,r2)       x86_encode_r32_rm32(0x0F12, r2, r1)
nkeynes@1011
   779
#define MOVHPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F16, r1, rb,d)
nkeynes@1011
   780
#define MOVHPS_xmm_r32disp(r1,rb,d)  x86_encode_r32_r32disp32(0x0F17, r1, rb,d)
nkeynes@991
   781
#define MOVLHPS_xmm_xmm(r1,r2)       x86_encode_r32_rm32(0x0F16, r2, r1)
nkeynes@1011
   782
#define MOVLPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F12, r1, rb,d)
nkeynes@1011
   783
#define MOVLPS_xmm_r32disp(r1,rb,d)  x86_encode_r32_r32disp32(0x0F13, r1, rb,d)
nkeynes@1011
   784
#define MOVUPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F10, r1, rb,d)
nkeynes@1011
   785
#define MOVUPS_xmm_r32disp(r1,rb,d)  x86_encode_r32_r32disp32(0x0F11, r1, rb,d)
nkeynes@991
   786
#define MULPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F59, r2, r1)
nkeynes@1011
   787
#define MULPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0xF59, r1, rb,d)
nkeynes@1011
   788
#define ORPS_r32disp_xmm(rb,d,r1)    x86_encode_r32_r32disp32(0x0F56, r1, rb,d)
nkeynes@991
   789
#define ORPS_xmm_xmm(r1,r2)          x86_encode_r32_rm32(0x0F56, r2, r1)
nkeynes@1011
   790
#define RCPPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0xF53, r1, rb,d)
nkeynes@991
   791
#define RCPPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F53, r2, r1)
nkeynes@1011
   792
#define RSQRTPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F52, r1, rb,d)
nkeynes@991
   793
#define RSQRTPS_xmm_xmm(r1,r2)       x86_encode_r32_rm32(0x0F52, r2, r1)
nkeynes@1011
   794
#define SHUFPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0FC6, r1, rb,d)
nkeynes@991
   795
#define SHUFPS_xmm_xmm(r1,r2)        x86_encode_r32_rm32(0x0FC6, r2, r1)
nkeynes@1011
   796
#define SQRTPS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F51, r1, rb,d)
nkeynes@991
   797
#define SQRTPS_xmm_xmm(r1,r2)        x86_encode_r32_rm32(0x0F51, r2, r1)
nkeynes@1011
   798
#define SUBPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)
nkeynes@991
   799
#define SUBPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F5C, r2, r1)
nkeynes@1011
   800
#define UNPCKHPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F15, r1, rb,d)
nkeynes@991
   801
#define UNPCKHPS_xmm_xmm(r1,r2)      x86_encode_r32_rm32(0x0F15, r2, r1)
nkeynes@1011
   802
#define UNPCKLPS_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F14, r1, rb,d)
nkeynes@991
   803
#define UNPCKLPS_xmm_xmm(r1,r2)      x86_encode_r32_rm32(0x0F14, r2, r1)
nkeynes@1011
   804
#define XORPS_r32disp_xmm(rb,d,r1)   x86_encode_r32_r32disp32(0x0F57, r1, rb,d)
nkeynes@991
   805
#define XORPS_xmm_xmm(r1,r2)         x86_encode_r32_rm32(0x0F57, r2, r1)
nkeynes@991
   806
nkeynes@991
   807
/* SSE Scalar floating point instructions */
nkeynes@1011
   808
#define ADDSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)
nkeynes@991
   809
#define ADDSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F58, r2, r1)
nkeynes@1011
   810
#define CMPSS_cc_r32disp_xmm(cc,rb,d,r) OP(0xF3); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)
nkeynes@991
   811
#define CMPSS_cc_xmm_xmm(cc,r1,r2)   OP(0xF3); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)
nkeynes@1011
   812
#define COMISS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F2F, r1, rb,d)
nkeynes@991
   813
#define COMISS_xmm_xmm(r1,r2)        x86_encode_r32_rm32(0x0F2F, r2, r1)
nkeynes@1006
   814
#define CVTSI2SSL_r32_xmm(r1,r2)     OP(0xF3); x86_encode_r32_rm32(0x0F2A, r2, r1)
nkeynes@1011
   815
#define CVTSI2SSL_r32disp_xmm(rb,d,r1)  OP(0xF3); x86_encode_r32_r32disp32(0x0F2A, r1, rb,d)
nkeynes@1006
   816
#define CVTSI2SSQ_r64_xmm(r1,r2)     OP(0xF3); x86_encode_r64_rm64(0x0F2A, r2, r1)
nkeynes@1011
   817
#define CVTSI2SSQ_r64disp_xmm(rb,d,r1)  OP(0xF3); x86_encode_r64_r64disp32(0x0F2A, r1, rb,d)
nkeynes@1006
   818
#define CVTSS2SIL_xmm_r32(r1,r2)     OP(0xF3); x86_encode_r32_rm32(0x0F2D, r2, r1)
nkeynes@1011
   819
#define CVTSS2SIL_r32disp_r32(rb,d,r1)  OP(0xF3); x86_encode_r32_r32disp32(0x0F2D, r1, rb, d)
nkeynes@1006
   820
#define CVTSS2SIQ_xmm_r64(r1,r2)     OP(0xF3); x86_encode_r64_rm64(0x0F2D, r2, r1)
nkeynes@1011
   821
#define CVTSS2SIQ_r64disp_r64(rb,d,r1)  OP(0xF3); x86_encode_r64_r64disp32(0x0F2D, r1, rb, d)
nkeynes@1006
   822
#define CVTTSS2SIL_xmm_r32(r1,r2)    OP(0xF3); x86_encode_r32_rm32(0x0F2C, r2, r1)
nkeynes@1011
   823
#define CVTTSS2SIL_r32disp_r32(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F2C, r1, rb, d)
nkeynes@1006
   824
#define CVTTSS2SIQ_xmm_r64(r1,r2)    OP(0xF3); x86_encode_r64_rm64(0x0F2C, r2, r1)
nkeynes@1011
   825
#define CVTTSS2SIQ_r64disp_r64(rb,d,r1) OP(0xF3); x86_encode_r64_r64disp32(0x0F2C, r1, rb, d)
nkeynes@1011
   826
#define DIVSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)
nkeynes@991
   827
#define DIVSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F5E, r2, r1)
nkeynes@1011
   828
#define MAXSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)
nkeynes@991
   829
#define MAXSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F5F, r2, r1)
nkeynes@1011
   830
#define MINSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)
nkeynes@991
   831
#define MINSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F5D, r2, r1)
nkeynes@1011
   832
#define MOVSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F10, r1, rb,d)
nkeynes@1011
   833
#define MOVSS_xmm_r32disp(r1,rb,d)   OP(0xF3); x86_encode_r32_r32disp32(0x0F11, r1, rb,d)
nkeynes@991
   834
#define MOVSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F10, r2, r1)
nkeynes@1011
   835
#define MULSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0xF59, r1, rb,d)
nkeynes@991
   836
#define MULSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F59, r2, r1)
nkeynes@1011
   837
#define RCPSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0xF53, r1, rb,d)
nkeynes@991
   838
#define RCPSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F53, r2, r1)
nkeynes@1011
   839
#define RSQRTSS_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F52, r1, rb,d)
nkeynes@991
   840
#define RSQRTSS_xmm_xmm(r1,r2)       OP(0xF3); x86_encode_r32_rm32(0x0F52, r2, r1)
nkeynes@1011
   841
#define SQRTSS_r32disp_xmm(rb,d,r1)  OP(0xF3); x86_encode_r32_r32disp32(0x0F51, r1, rb,d)
nkeynes@991
   842
#define SQRTSS_xmm_xmm(r1,r2)        OP(0xF3); x86_encode_r32_rm32(0x0F51, r2, r1)
nkeynes@1011
   843
#define SUBSS_r32disp_xmm(rb,d,r1)   OP(0xF3); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)
nkeynes@991
   844
#define SUBSS_xmm_xmm(r1,r2)         OP(0xF3); x86_encode_r32_rm32(0x0F5C, r2, r1)
nkeynes@1011
   845
#define UCOMISS_r32disp_xmm(rb,d,r1)  x86_encode_r32_r32disp32(0x0F2E, r1, rb,d)
nkeynes@991
   846
#define UCOMISS_xmm_xmm(r1,r2)       x86_encode_r32_rm32(0x0F2E, r2, r1)
nkeynes@991
   847
nkeynes@991
   848
/* SSE2 Packed floating point instructions */
nkeynes@1011
   849
#define ADDPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)
nkeynes@991
   850
#define ADDPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F58, r2, r1)
nkeynes@1011
   851
#define ANDPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F54, r1, rb,d)
nkeynes@991
   852
#define ANDPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F54, r2, r1)
nkeynes@1011
   853
#define ANDNPD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0F55, r1, rb,d)
nkeynes@991
   854
#define ANDNPD_xmm_xmm(r1,r2)        OP(0x66); x86_encode_r32_rm32(0x0F55, r2, r1)
nkeynes@1011
   855
#define CMPPD_cc_r32disp_xmm(cc,rb,d,r) OP(0x66); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)
nkeynes@991
   856
#define CMPPD_cc_xmm_xmm(cc,r1,r2)   OP(0x66); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)
nkeynes@1011
   857
#define CVTPD2PS_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)
nkeynes@991
   858
#define CVTPD2PS_xmm_xmm(r1,r2)      OP(0x66); x86_encode_r32_rm32(0x0F5A, r2, r1)
nkeynes@1011
   859
#define CVTPS2PD_r32disp_xmm(rb,d,r1) x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)
nkeynes@991
   860
#define CVTPS2PD_xmm_xmm(r1,r2)      x86_encode_r32_rm32(0x0F5A, r2, r1)
nkeynes@1011
   861
#define DIVPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)
nkeynes@991
   862
#define DIVPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F5E, r2, r1)
nkeynes@1011
   863
#define MAXPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)
nkeynes@991
   864
#define MAXPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F5F, r2, r1)
nkeynes@1011
   865
#define MINPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)
nkeynes@991
   866
#define MINPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F5D, r2, r1)
nkeynes@1011
   867
#define MOVHPD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0F16, r1, rb,d)
nkeynes@1011
   868
#define MOVHPD_xmm_r32disp(r1,rb,d)  OP(0x66); x86_encode_r32_r32disp32(0x0F17, r1, rb,d)
nkeynes@1011
   869
#define MOVLPD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0F12, r1, rb,d)
nkeynes@1011
   870
#define MOVLPD_xmm_r32disp(r1,rb,d)  OP(0x66); x86_encode_r32_r32disp32(0x0F13, r1, rb,d)
nkeynes@1011
   871
#define MULPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0xF59, r1, rb,d)
nkeynes@991
   872
#define MULPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F59, r2, r1)
nkeynes@1011
   873
#define ORPD_r32disp_xmm(rb,d,r1)    OP(0x66); x86_encode_r32_r32disp32(0x0F56, r1, rb,d)
nkeynes@991
   874
#define ORPD_xmm_xmm(r1,r2)          OP(0x66); x86_encode_r32_rm32(0x0F56, r2, r1)
nkeynes@1011
   875
#define SHUFPD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0FC6, r1, rb,d)
nkeynes@991
   876
#define SHUFPD_xmm_xmm(r1,r2)        OP(0x66); x86_encode_r32_rm32(0x0FC6, r2, r1)
nkeynes@1011
   877
#define SUBPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)
nkeynes@991
   878
#define SUBPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F5C, r2, r1)
nkeynes@1011
   879
#define UNPCKHPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F15, r1, disp)
nkeynes@991
   880
#define UNPCKHPD_xmm_xmm(r1,r2)      OP(0x66); x86_encode_r32_rm32(0x0F15, r2, r1)
nkeynes@1011
   881
#define UNPCKLPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0F14, r1, disp)
nkeynes@991
   882
#define UNPCKLPD_xmm_xmm(r1,r2)      OP(0x66); x86_encode_r32_rm32(0x0F14, r2, r1)
nkeynes@1011
   883
#define XORPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F57, r1, rb,d)
nkeynes@991
   884
#define XORPD_xmm_xmm(r1,r2)         OP(0x66); x86_encode_r32_rm32(0x0F57, r2, r1)
nkeynes@991
   885
nkeynes@991
   886
nkeynes@991
   887
/* SSE2 Scalar floating point instructions */
nkeynes@1011
   888
#define ADDSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F58, r1, rb,d)
nkeynes@991
   889
#define ADDSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F58, r2, r1)
nkeynes@1011
   890
#define CMPSD_cc_r32disp_xmm(cc,rb,d,r) OP(0xF2); x86_encode_r32_r32disp32(0x0FC2, r, rb, d); OP(cc)
nkeynes@991
   891
#define CMPSD_cc_xmm_xmm(cc,r1,r2)   OP(0xF2); x86_encode_r32_rm32(0x0FC2, r2, r1); OP(cc)
nkeynes@1006
   892
#define CVTSI2SDL_r32_xmm(r1,r2)     OP(0xF2); x86_encode_r32_rm32(0x0F2A, r2, r1)
nkeynes@1011
   893
#define CVTSI2SDL_r32disp_xmm(rb,d,r1)  OP(0xF2); x86_encode_r32_r32disp32(0x0F2A, r1, rb,d)
nkeynes@1006
   894
#define CVTSI2SDQ_r64_xmm(r1,r2)     OP(0xF2); x86_encode_r64_rm64(0x0F2A, r2, r1)
nkeynes@1011
   895
#define CVTSI2SDQ_r64disp_xmm(rb,d,r1)  OP(0xF2); x86_encode_r64_r64disp32(0x0F2A, r1, rb,d)
nkeynes@1006
   896
#define CVTSD2SIL_xmm_r32(r1,r2)     OP(0xF2); x86_encode_r32_rm32(0x0F2D, r2, r1)
nkeynes@1011
   897
#define CVTSD2SIL_r32disp_r32(rb, d,r1)  OP(0xF2); x86_encode_r32_r32disp32(0x0F2D, r1, rb, d)
nkeynes@1006
   898
#define CVTSD2SIQ_xmm_r64(r1,r2)     OP(0xF2); x86_encode_r64_rm64(0x0F2D, r2, r1)
nkeynes@1011
   899
#define CVTSD2SIQ_r64disp_r64(rb,d,r1)  OP(0xF2); x86_encode_r64_r64disp32(0x0F2D, r1, rb, d)
nkeynes@1011
   900
#define CVTSD2SS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)
nkeynes@1006
   901
#define CVTSD2SS_xmm_xmm(r1,r2)      OP(0xF2); x86_encode_r32_rm32(0x0F5A, r2, r1)
nkeynes@1011
   902
#define CVTSS2SD_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F5A, r1, rb,d)
nkeynes@1006
   903
#define CVTSS2SD_xmm_xmm(r1,r2)      OP(0xF3); x86_encode_r32_rm32(0x0F5A, r2, r1)
nkeynes@1006
   904
#define CVTTSD2SIL_xmm_r32(r1,r2)    OP(0xF2); x86_encode_r32_rm32(0x0F2C, r2, r1)
nkeynes@1011
   905
#define CVTTSD2SIL_r32disp_r32(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0F2C, r1, rb, d)
nkeynes@1006
   906
#define CVTTSD2SIQ_xmm_r64(r1,r2)    OP(0xF2); x86_encode_r64_rm64(0x0F2C, r2, r1)
nkeynes@1011
   907
#define CVTTSD2SIQ_r64disp_r64(rb,d,r1) OP(0xF2); x86_encode_r64_r64disp32(0x0F2C, r1, rb, d)
nkeynes@1006
   908
nkeynes@1011
   909
#define COMISD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0F2F, r1, rb,d)
nkeynes@991
   910
#define COMISD_xmm_xmm(r1,r2)        OP(0x66); x86_encode_r32_rm32(0x0F2F, r2, r1)
nkeynes@1011
   911
#define DIVSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F5E, r1, rb,d)
nkeynes@991
   912
#define DIVSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F5E, r2, r1)
nkeynes@1011
   913
#define MAXSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F5F, r1, rb,d)
nkeynes@991
   914
#define MAXSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F5F, r2, r1)
nkeynes@1011
   915
#define MINSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F5D, r1, rb,d)
nkeynes@991
   916
#define MINSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F5D, r2, r1)
nkeynes@1011
   917
#define MOVSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F10, r1, rb,d)
nkeynes@1011
   918
#define MOVSD_xmm_r32disp(r1,rb,d)   OP(0xF2); x86_encode_r32_r32disp32(0x0F11, r1, rb,d)
nkeynes@991
   919
#define MOVSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F10, r2, r1)
nkeynes@1011
   920
#define MULSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0xF59, r1, rb,d)
nkeynes@991
   921
#define MULSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F59, r2, r1)
nkeynes@1011
   922
#define SQRTSD_r32disp_xmm(rb,d,r1)  OP(0xF2); x86_encode_r32_r32disp32(0x0F51, r1, rb,d)
nkeynes@991
   923
#define SQRTSD_xmm_xmm(r1,r2)        OP(0xF2); x86_encode_r32_rm32(0x0F51, r2, r1)
nkeynes@1011
   924
#define SUBSD_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F5C, r1, rb,d)
nkeynes@991
   925
#define SUBSD_xmm_xmm(r1,r2)         OP(0xF2); x86_encode_r32_rm32(0x0F5C, r2, r1)
nkeynes@1011
   926
#define UCOMISD_r32disp_xmm(rb,d,r1)  OP(0x66); x86_encode_r32_r32disp32(0x0F2E, r1, rb,d)
nkeynes@991
   927
#define UCOMISD_xmm_xmm(r1,r2)       OP(0x66); x86_encode_r32_rm32(0x0F2E, r2, r1)
nkeynes@991
   928
nkeynes@991
   929
/* SSE3 floating point instructions */
nkeynes@1011
   930
#define ADDSUBPD_r32disp_xmm(rb,d,r1) OP(0x66); x86_encode_r32_r32disp32(0x0FD0, r1, rb,d)
nkeynes@991
   931
#define ADDSUBPD_xmm_xmm(r1,r2)      OP(0x66); x86_encode_r32_rm32(0x0FD0, r2, r1)
nkeynes@1011
   932
#define ADDSUBPS_r32disp_xmm(rb,d,r1) OP(0xF2); x86_encode_r32_r32disp32(0x0FD0, r1, rb,d)
nkeynes@991
   933
#define ADDSUBPS_xmm_xmm(r1,r2)      OP(0xF2); x86_encode_r32_rm32(0x0FD0, r2, r1)
nkeynes@1011
   934
#define HADDPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F7C, r1, rb,d)
nkeynes@991
   935
#define HADDPD_xmm_xmm(r1,r2)        OP(0x66); x86_encode_r32_rm32(0x0F7C, r2, r1)
nkeynes@1011
   936
#define HADDPS_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F7C, r1, rb,d)
nkeynes@991
   937
#define HADDPS_xmm_xmm(r1,r2)        OP(0xF2); x86_encode_r32_rm32(0x0F7C, r2, r1)
nkeynes@1011
   938
#define HSUBPD_r32disp_xmm(rb,d,r1)   OP(0x66); x86_encode_r32_r32disp32(0x0F7D, r1, rb,d)
nkeynes@991
   939
#define HSUBPD_xmm_xmm(r1,r2)        OP(0x66); x86_encode_r32_rm32(0x0F7D, r2, r1)
nkeynes@1011
   940
#define HSUBPS_r32disp_xmm(rb,d,r1)   OP(0xF2); x86_encode_r32_r32disp32(0x0F7D, r1, rb,d)
nkeynes@991
   941
#define HSUBPS_xmm_xmm(r1,r2)        OP(0xF2); x86_encode_r32_rm32(0x0F7D, r2, r1)
nkeynes@1011
   942
#define MOVSHDUP_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F16, r1, rb,d)
nkeynes@991
   943
#define MOVSHDUP_xmm_xmm(r1,r2)      OP(0xF3); x86_encode_r32_rm32(0x0F16, r2, r1)
nkeynes@1011
   944
#define MOVSLDUP_r32disp_xmm(rb,d,r1) OP(0xF3); x86_encode_r32_r32disp32(0x0F12, r1, rb,d)
nkeynes@991
   945
#define MOVSLDUP_xmm_xmm(r1,r2)      OP(0xF3); x86_encode_r32_rm32(0x0F12, r2, r1)
nkeynes@995
   946
nkeynes@995
   947
/************************ Import calling conventions *************************/
nkeynes@995
   948
#if SIZEOF_VOID_P == 8
nkeynes@995
   949
#include "xlat/x86/amd64abi.h"
nkeynes@995
   950
#else /* 32-bit system */
nkeynes@995
   951
#include "xlat/x86/ia32abi.h"
nkeynes@995
   952
#endif
nkeynes@995
   953
nkeynes@995
   954
#endif /* !lxdream_x86op_H */
.