]> granicus.if.org Git - yasm/commitdiff
Merge immediate and relative structures.
authorPeter Johnson <peter@tortall.net>
Fri, 18 May 2001 21:42:32 +0000 (21:42 -0000)
committerPeter Johnson <peter@tortall.net>
Fri, 18 May 2001 21:42:32 +0000 (21:42 -0000)
svn path=/trunk/yasm/; revision=11

include/bytecode.h
libyasm/bytecode.c
libyasm/bytecode.h
modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
src/bison.y
src/bison.y.in
src/bytecode.c
src/bytecode.h
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y

index 658fc5cd92cf4627c3db567720b55845e34ed932..fce3b5f3497d926be558055304d2cb81f766ccad 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $
+/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -34,14 +34,11 @@ typedef struct effaddr_s {
 
 typedef struct immval_s {
     unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
+    unsigned char len;         /* length of val (in bytes), 0 if none */
+    unsigned char isrel;
+    unsigned char isneg;       /* the value has been explicitly negated */
 } immval;
 
-typedef struct relval_s {
-    unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
-} relval;
-
 typedef struct bytecode_s {
     struct bytecode_s *next;
 
@@ -50,15 +47,17 @@ typedef struct bytecode_s {
     union {
        struct {
            effaddr ea;                 /* effective address */
-           union {
-               immval im;              /* immediate value */
-               relval rel;
-           } imm;
+
+           immval imm;                 /* immediate or relative value */
+           unsigned char f_len_imm;    /* final imm length */
+           unsigned char f_rel_imm;    /* 1 if final imm should be rel */
+           unsigned char f_sign_imm;   /* 1 if final imm should be signed */
+
            unsigned char opcode[2];    /* opcode */
            unsigned char opcode_len;
+
            unsigned char opersize;     /* 0 indicates no override */
            unsigned char lockrep_pre;  /* 0 indicates no prefix */
-           unsigned char isrel;
        } insn;
        struct {
            unsigned char *data;
@@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 
-relval *ConvertImmToRel(relval *ptr, immval *im_ptr,
-    unsigned char rel_forcelen);
-
 void BuildBC_Insn(bytecode *bc, unsigned char opersize,
     unsigned char opcode_len, unsigned char op0, unsigned char op1,
     effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
-    unsigned char im_forcelen);
-
-void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, relval *rel_ptr);
+    unsigned char im_len, unsigned char im_sign, unsigned char im_rel);
 
 unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len);
 
index 3e9baf4960e402c49fff2a503eca135adbc62fee..f784296f598f09835a2a4d54d4df48e9609a436b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.1 2001/05/15 05:23:23 peter Exp $
+/* $Id: bytecode.c,v 1.2 2001/05/18 21:42:32 peter Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
 #include "globals.h"
 #include "bytecode.h"
 
-static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare);
-
 static effaddr eff_static;
 static immval im_static;
-static relval rel_static;
 unsigned char bytes_static[16];
 
 /* FIXME: converting int to EA, but we don't know addrsize yet? 
@@ -88,29 +83,16 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val)
     else
        ptr->len = 4;
 
-    return ptr;
-}
-
-/* FIXME: This actually doesn't do anything useful yet :) */
-relval *ConvertImmToRel(relval *ptr, immval *im_ptr,
-    unsigned char rel_forcelen)
-{
-    if(!ptr)
-       ptr = &rel_static;
-
-    if(im_ptr) {
-       ptr->val = im_ptr->val;
-       ptr->len = im_ptr->len;
-    } else {
-       ptr->len = 0;
-    }
+    ptr->isrel = 0;
+    ptr->isneg = 0;
 
     return ptr;
 }
 
-static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
+void BuildBC_Insn(bytecode *bc, unsigned char opersize,
     unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare)
+    effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
+    unsigned char im_len, unsigned char im_sign, unsigned char im_rel)
 {
     bc->next = (bytecode *)NULL;
     bc->type = BC_INSN;
@@ -126,6 +108,15 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
        bc->data.insn.ea.need_sib = 0;
     }
 
+    if(im_ptr) {
+       bc->data.insn.imm = *im_ptr;
+    } else {
+       bc->data.insn.imm.len = 0;
+    }
+    bc->data.insn.f_rel_imm = im_rel;
+    bc->data.insn.f_sign_imm = im_sign;
+    bc->data.insn.f_len_imm = im_len;
+
     bc->data.insn.opcode[0] = op0;
     bc->data.insn.opcode[1] = op1;
     bc->data.insn.opcode_len = opcode_len;
@@ -141,37 +132,6 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
     bc->mode_bits = mode_bits;
 }
  
-
-void BuildBC_Insn(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
-    unsigned char im_forcelen)
-{
-    buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare);
-
-    if(im_ptr) {
-       bc->data.insn.imm.im = *im_ptr;
-       bc->data.insn.imm.im.len = im_forcelen;         /* TODO: Add Warning */
-    } else {
-       bc->data.insn.imm.im.len = 0;
-    }
-    bc->data.insn.isrel = 0;
-}
-
-void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, relval *rel_ptr)
-{
-    buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare);
-
-    if(rel_ptr) {
-       bc->data.insn.imm.rel = *rel_ptr;
-    } else {
-       bc->data.insn.imm.rel.len = 0;
-    }
-    bc->data.insn.isrel = 1;
-}
-
 /* TODO: implement.  Shouldn't be difficult. */
 unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len)
 {
@@ -197,15 +157,14 @@ void DebugPrintBC(bytecode *bc)
                (unsigned int)bc->data.insn.ea.modrm,
                (unsigned int)bc->data.insn.ea.sib,
                (unsigned int)bc->data.insn.ea.need_sib);
-           if(bc->data.insn.isrel) {
-               printf("Relative Offset:\n");
-               printf(" Val=%lx Len=%u\n", bc->data.insn.imm.rel.val,
-                   (unsigned int)bc->data.insn.imm.rel.len);
-           } else {
-               printf("Immediate Value:\n");
-               printf(" Val=%lx Len=%u\n", bc->data.insn.imm.im.val,
-                   (unsigned int)bc->data.insn.imm.im.len);
-           }
+           printf("Immediate/Relative Value:\n");
+           printf(" Val=%lx Len=%u, IsRel=%u\n", bc->data.insn.imm.val,
+               (unsigned int)bc->data.insn.imm.len,
+               (unsigned int)bc->data.insn.imm.isrel);
+           printf(" FLen=%u, FRel=%u, FSign=%u\n",
+               (unsigned int)bc->data.insn.f_len_imm,
+               (unsigned int)bc->data.insn.f_rel_imm,
+               (unsigned int)bc->data.insn.f_sign_imm);
            printf("Opcode: %2x %2x OpLen=%u\n",
                (unsigned int)bc->data.insn.opcode[0],
                (unsigned int)bc->data.insn.opcode[1],
index 658fc5cd92cf4627c3db567720b55845e34ed932..fce3b5f3497d926be558055304d2cb81f766ccad 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $
+/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -34,14 +34,11 @@ typedef struct effaddr_s {
 
 typedef struct immval_s {
     unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
+    unsigned char len;         /* length of val (in bytes), 0 if none */
+    unsigned char isrel;
+    unsigned char isneg;       /* the value has been explicitly negated */
 } immval;
 
-typedef struct relval_s {
-    unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
-} relval;
-
 typedef struct bytecode_s {
     struct bytecode_s *next;
 
@@ -50,15 +47,17 @@ typedef struct bytecode_s {
     union {
        struct {
            effaddr ea;                 /* effective address */
-           union {
-               immval im;              /* immediate value */
-               relval rel;
-           } imm;
+
+           immval imm;                 /* immediate or relative value */
+           unsigned char f_len_imm;    /* final imm length */
+           unsigned char f_rel_imm;    /* 1 if final imm should be rel */
+           unsigned char f_sign_imm;   /* 1 if final imm should be signed */
+
            unsigned char opcode[2];    /* opcode */
            unsigned char opcode_len;
+
            unsigned char opersize;     /* 0 indicates no override */
            unsigned char lockrep_pre;  /* 0 indicates no prefix */
-           unsigned char isrel;
        } insn;
        struct {
            unsigned char *data;
@@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 
-relval *ConvertImmToRel(relval *ptr, immval *im_ptr,
-    unsigned char rel_forcelen);
-
 void BuildBC_Insn(bytecode *bc, unsigned char opersize,
     unsigned char opcode_len, unsigned char op0, unsigned char op1,
     effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
-    unsigned char im_forcelen);
-
-void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, relval *rel_ptr);
+    unsigned char im_len, unsigned char im_sign, unsigned char im_rel);
 
 unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len);
 
index 036f5b7613d1a7987ff0d735c71fa872b3a61f4d..edeb7b124cc6f932a91f27341762cf4f1cc91498 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;
 
index 77cc3be2e9185649aa814b2fa7d625e3ac648fce..3416da0a780f992d69a929555842b5150ae58166 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;
 
index cc04b9b5e75150eed7fa43757353a5a44def7b4b..16b7157c448014c040ba54928c39fcbffb20ba86 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;
 
index 036f5b7613d1a7987ff0d735c71fa872b3a61f4d..edeb7b124cc6f932a91f27341762cf4f1cc91498 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;
 
index 3e9baf4960e402c49fff2a503eca135adbc62fee..f784296f598f09835a2a4d54d4df48e9609a436b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.1 2001/05/15 05:23:23 peter Exp $
+/* $Id: bytecode.c,v 1.2 2001/05/18 21:42:32 peter Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
 #include "globals.h"
 #include "bytecode.h"
 
-static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare);
-
 static effaddr eff_static;
 static immval im_static;
-static relval rel_static;
 unsigned char bytes_static[16];
 
 /* FIXME: converting int to EA, but we don't know addrsize yet? 
@@ -88,29 +83,16 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val)
     else
        ptr->len = 4;
 
-    return ptr;
-}
-
-/* FIXME: This actually doesn't do anything useful yet :) */
-relval *ConvertImmToRel(relval *ptr, immval *im_ptr,
-    unsigned char rel_forcelen)
-{
-    if(!ptr)
-       ptr = &rel_static;
-
-    if(im_ptr) {
-       ptr->val = im_ptr->val;
-       ptr->len = im_ptr->len;
-    } else {
-       ptr->len = 0;
-    }
+    ptr->isrel = 0;
+    ptr->isneg = 0;
 
     return ptr;
 }
 
-static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
+void BuildBC_Insn(bytecode *bc, unsigned char opersize,
     unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare)
+    effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
+    unsigned char im_len, unsigned char im_sign, unsigned char im_rel)
 {
     bc->next = (bytecode *)NULL;
     bc->type = BC_INSN;
@@ -126,6 +108,15 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
        bc->data.insn.ea.need_sib = 0;
     }
 
+    if(im_ptr) {
+       bc->data.insn.imm = *im_ptr;
+    } else {
+       bc->data.insn.imm.len = 0;
+    }
+    bc->data.insn.f_rel_imm = im_rel;
+    bc->data.insn.f_sign_imm = im_sign;
+    bc->data.insn.f_len_imm = im_len;
+
     bc->data.insn.opcode[0] = op0;
     bc->data.insn.opcode[1] = op1;
     bc->data.insn.opcode_len = opcode_len;
@@ -141,37 +132,6 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize,
     bc->mode_bits = mode_bits;
 }
  
-
-void BuildBC_Insn(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
-    unsigned char im_forcelen)
-{
-    buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare);
-
-    if(im_ptr) {
-       bc->data.insn.imm.im = *im_ptr;
-       bc->data.insn.imm.im.len = im_forcelen;         /* TODO: Add Warning */
-    } else {
-       bc->data.insn.imm.im.len = 0;
-    }
-    bc->data.insn.isrel = 0;
-}
-
-void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, relval *rel_ptr)
-{
-    buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare);
-
-    if(rel_ptr) {
-       bc->data.insn.imm.rel = *rel_ptr;
-    } else {
-       bc->data.insn.imm.rel.len = 0;
-    }
-    bc->data.insn.isrel = 1;
-}
-
 /* TODO: implement.  Shouldn't be difficult. */
 unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len)
 {
@@ -197,15 +157,14 @@ void DebugPrintBC(bytecode *bc)
                (unsigned int)bc->data.insn.ea.modrm,
                (unsigned int)bc->data.insn.ea.sib,
                (unsigned int)bc->data.insn.ea.need_sib);
-           if(bc->data.insn.isrel) {
-               printf("Relative Offset:\n");
-               printf(" Val=%lx Len=%u\n", bc->data.insn.imm.rel.val,
-                   (unsigned int)bc->data.insn.imm.rel.len);
-           } else {
-               printf("Immediate Value:\n");
-               printf(" Val=%lx Len=%u\n", bc->data.insn.imm.im.val,
-                   (unsigned int)bc->data.insn.imm.im.len);
-           }
+           printf("Immediate/Relative Value:\n");
+           printf(" Val=%lx Len=%u, IsRel=%u\n", bc->data.insn.imm.val,
+               (unsigned int)bc->data.insn.imm.len,
+               (unsigned int)bc->data.insn.imm.isrel);
+           printf(" FLen=%u, FRel=%u, FSign=%u\n",
+               (unsigned int)bc->data.insn.f_len_imm,
+               (unsigned int)bc->data.insn.f_rel_imm,
+               (unsigned int)bc->data.insn.f_sign_imm);
            printf("Opcode: %2x %2x OpLen=%u\n",
                (unsigned int)bc->data.insn.opcode[0],
                (unsigned int)bc->data.insn.opcode[1],
index 658fc5cd92cf4627c3db567720b55845e34ed932..fce3b5f3497d926be558055304d2cb81f766ccad 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $
+/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -34,14 +34,11 @@ typedef struct effaddr_s {
 
 typedef struct immval_s {
     unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
+    unsigned char len;         /* length of val (in bytes), 0 if none */
+    unsigned char isrel;
+    unsigned char isneg;       /* the value has been explicitly negated */
 } immval;
 
-typedef struct relval_s {
-    unsigned long val;
-    unsigned char len;         /* length of val (in bytes) */
-} relval;
-
 typedef struct bytecode_s {
     struct bytecode_s *next;
 
@@ -50,15 +47,17 @@ typedef struct bytecode_s {
     union {
        struct {
            effaddr ea;                 /* effective address */
-           union {
-               immval im;              /* immediate value */
-               relval rel;
-           } imm;
+
+           immval imm;                 /* immediate or relative value */
+           unsigned char f_len_imm;    /* final imm length */
+           unsigned char f_rel_imm;    /* 1 if final imm should be rel */
+           unsigned char f_sign_imm;   /* 1 if final imm should be signed */
+
            unsigned char opcode[2];    /* opcode */
            unsigned char opcode_len;
+
            unsigned char opersize;     /* 0 indicates no override */
            unsigned char lockrep_pre;  /* 0 indicates no prefix */
-           unsigned char isrel;
        } insn;
        struct {
            unsigned char *data;
@@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 
-relval *ConvertImmToRel(relval *ptr, immval *im_ptr,
-    unsigned char rel_forcelen);
-
 void BuildBC_Insn(bytecode *bc, unsigned char opersize,
     unsigned char opcode_len, unsigned char op0, unsigned char op1,
     effaddr *ea_ptr, unsigned char spare, immval *im_ptr,
-    unsigned char im_forcelen);
-
-void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize,
-    unsigned char opcode_len, unsigned char op0, unsigned char op1,
-    effaddr *ea_ptr, unsigned char spare, relval *rel_ptr);
+    unsigned char im_len, unsigned char im_sign, unsigned char im_rel);
 
 unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len);
 
index 036f5b7613d1a7987ff0d735c71fa872b3a61f4d..edeb7b124cc6f932a91f27341762cf4f1cc91498 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;
 
index 77cc3be2e9185649aa814b2fa7d625e3ac648fce..3416da0a780f992d69a929555842b5150ae58166 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $
+/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -327,106 +327,106 @@ instrbase:      aaa
 ;
 
 aaa: INS_AAA {
-       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 aad: INS_AAD {
-       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_AAD imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0);
     }
 ;
 
 idiv: INS_IDIV rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
     | INS_IDIV rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 imul: INS_IMUL rm8x {
-       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm16x {
-       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL rm32x {
-       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' rm16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' rm32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0);
     }
     | INS_IMUL reg16 ',' imm8x {
-       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg32 ',' imm8x {
-       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0);
     }
     | INS_IMUL reg16 ',' imm16 {
-       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2);
+       BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0);
     }
     | INS_IMUL reg32 ',' imm32 {
-       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4);
+       BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0);
     }
 ;
 
 in: INS_IN REG_AL ',' imm8 {
-       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AX ',' imm8 {
-       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_EAX ',' imm8 {
-       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1);
+       BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0);
     }
     | INS_IN REG_AL ',' REG_DX {
-       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_AX ',' REG_DX {
-       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
     | INS_IN REG_EAX ',' REG_DX {
-       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0);
     }
 ;
 
 loopz: INS_LOOPZ imm1632 {
-       BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_CX {
-       BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
     | INS_LOOPZ imm1632 ',' REG_ECX {
-       BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1));
+       BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1);
     }
 ;
 
 lsl: INS_LSL reg16 ',' rm16 {
-       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
     | INS_LSL reg32 ',' rm32 {
-       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0);
+       BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0);
     }
 ;