소스 검색

+ x86 assembler: fixed MOVABS instruction (it is a x86_64-only subset of MOV with 8-byte immediates/offsets) and same-form encodings of MOV instruction.

git-svn-id: trunk@17666 -
sergei 14 년 전
부모
커밋
354d0520b7
6개의 변경된 파일162개의 추가작업 그리고 37개의 파일을 삭제
  1. 1 1
      compiler/i386/i386nop.inc
  2. 20 13
      compiler/i386/i386tab.inc
  3. 30 11
      compiler/x86/aasmcpu.pas
  4. 15 7
      compiler/x86/x86ins.dat
  5. 1 1
      compiler/x86_64/x8664nop.inc
  6. 95 4
      compiler/x86_64/x8664tab.inc

+ 1 - 1
compiler/i386/i386nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-1202;
+1203;

+ 20 - 13
compiler/i386/i386tab.inc

@@ -2915,9 +2915,16 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_mem_offs,ot_reg_ax or ot_bits32,ot_none);
-    code    : #208#1#163#28;
-    flags   : if_8086 or if_sm or if_nox86_64
+    optypes : (ot_mem_offs,ot_reg_ax,ot_none);
+    code    : #212#1#163#36;
+    flags   : if_8086 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_eax,ot_none);
+    code    : #213#1#163#36;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
@@ -2930,15 +2937,15 @@
     opcode  : A_MOV;
     ops     : 2;
     optypes : (ot_reg_ax,ot_mem_offs,ot_none);
-    code    : #212#1#161#29;
-    flags   : if_8086 or if_sm or if_nox86_64
+    code    : #212#1#161#37;
+    flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
     ops     : 2;
     optypes : (ot_reg_eax,ot_mem_offs,ot_none);
-    code    : #213#1#161#29;
-    flags   : if_386 or if_sm or if_nox86_64
+    code    : #213#1#161#37;
+    flags   : if_386 or if_sm
   ),
   (
     opcode  : A_MOV;
@@ -2950,8 +2957,8 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#8#184#29;
+    optypes : (ot_reg32,ot_immediate,ot_none);
+    code    : #213#8#184#33;
     flags   : if_386 or if_sd
   ),
   (
@@ -2979,8 +2986,8 @@
     opcode  : A_MOV;
     ops     : 2;
     optypes : (ot_mem_offs,ot_reg_al,ot_none);
-    code    : #1#162#28;
-    flags   : if_8086 or if_sm or if_nox86_64
+    code    : #1#162#36;
+    flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;
@@ -2993,8 +3000,8 @@
     opcode  : A_MOV;
     ops     : 2;
     optypes : (ot_reg_al,ot_mem_offs,ot_none);
-    code    : #1#160#29;
-    flags   : if_8086 or if_sm or if_nox86_64
+    code    : #1#160#37;
+    flags   : if_8086 or if_sm
   ),
   (
     opcode  : A_MOV;

+ 30 - 11
compiler/x86/aasmcpu.pas

@@ -1767,14 +1767,15 @@ implementation
                 else
                   inc(len,4);
               end;
+            36,37,38:
+              inc(len,sizeof(pint));
+            44,45,46:
+              inc(len,8);
             32,33,34,
             52,53,54,
             56,57,58,
             172,173,174 :
               inc(len,4);
-            192,193,194 :
-              if NeedAddrPrefix(c-192) then
-               inc(len);
             208,209,210 :
               begin
                 case (oper[c-208]^.ot and OT_SIZE_MASK) of
@@ -1884,7 +1885,10 @@ implementation
        *                 assembly mode or the address-size override on the operand
        * \37           - a word constant, from the _segment_ part of operand 0
        * \40, \41, \42 - a long immediate operand, from operand 0, 1 or 2
+       * \44, \45, \46 - select between \3[012], \4[012] or \5[456] depending
+                         on the address size of instruction
        * \50, \51, \52 - a byte relative operand, from operand 0, 1 or 2
+       * \54, \55, \56 - a qword immediate, from operand 0, 1 or 2
        * \60, \61, \62 - a word relative operand, from operand 0, 1 or 2
        * \64, \65, \66 - select between \6[012] and \7[012] depending on 16/32 bit
        *                 assembly mode or the address-size override on the operand
@@ -2170,6 +2174,21 @@ implementation
                 else
                  objdata.writebytes(currval,4);
               end;
+            36,37,38 :   // 044..046 - select between word/dword/qword depending on
+              begin      // address size (we support only default address sizes).
+                getvalsym(c-36);
+{$ifdef x86_64}
+                if assigned(currsym) then
+                  objdata_writereloc(currval,8,currsym,currabsreloc)
+                else
+                  objdata.writebytes(currval,8);
+{$else x86_64}
+                if assigned(currsym) then
+                  objdata_writereloc(currval,4,currsym,currabsreloc32)
+                else
+                  objdata.writebytes(currval,4);
+{$endif x86_64}
+              end;
             40,41,42 :   // 050..052 - byte relative operand
               begin
                 getvalsym(c-40);
@@ -2180,6 +2199,14 @@ implementation
                  Message1(asmw_e_short_jmp_out_of_range,tostr(data));
                 objdata.writebytes(data,1);
               end;
+            44,45,46:   // 054..056 - qword immediate operand
+              begin
+                getvalsym(c-44);
+                if assigned(currsym) then
+                  objdata_writereloc(currval,8,currsym,currabsreloc)
+                else
+                  objdata.writebytes(currval,8);
+              end;
             52,53,54 :  // 064..066 - select between 16/32 address mode, but we support only 32
               begin
                 getvalsym(c-52);
@@ -2207,14 +2234,6 @@ implementation
                 else
                   objdata.writebytes(currval,4);
               end;
-            192,193,194 :
-              begin
-                if NeedAddrPrefix(c-192) then
-                 begin
-                   bytes[0]:=$67;
-                   objdata.writebytes(bytes,1);
-                 end;
-              end;
             200 :   { fixed 16-bit addr }
 {$ifndef x86_64}
               begin

+ 15 - 7
compiler/x86/x86ins.dat

@@ -1024,19 +1024,23 @@ reg_eax,reg_ecx,reg_edx      \3\x0F\x01\xC8           PRESCOTT,ND
 
 [MOV,movX]
 (Ch_Wop2, Ch_Rop1, Ch_None)
-mem_offs,reg_ax|32    \320\1\xA3\34                   8086,SM,NOX86_64
+mem_offs,reg_ax       \324\1\xA3\44                   8086,SM
+mem_offs,reg_eax      \325\1\xA3\44                   386,SM
+mem_offs,reg_rax      \326\1\xA3\44                   X86_64,SM
 regmem,reg16|32|64    \320\1\x89\101                  8086,SM
-reg_ax,mem_offs       \324\1\xA1\35                   8086,SM,NOX86_64
-reg_eax,mem_offs      \325\1\xA1\35                   386,SM,NOX86_64
+reg_ax,mem_offs       \324\1\xA1\45                   8086,SM
+reg_eax,mem_offs      \325\1\xA1\45                   386,SM
+reg_rax,mem_offs      \326\1\xA1\45                   X86_64,SM
 reg16|32|64,regmem    \320\1\x8B\110                  8086,SM
-reg32|64,imm          \320\10\xB8\35                  386,SD
+reg32,imm             \325\10\xB8\41                  386,SD
+reg64,imm             \326\10\xB8\55                  X86_64,SM
 rm32,imm              \325\1\xC7\200\41               386,SM
 rm64,imm              \326\1\xC7\200\255              X86_64,SM
 reg16,imm             \324\10\xB8\31                  8086,SW
 rm16,imm              \324\1\xC7\200\31               8086,SW
-mem_offs,reg_al       \1\xA2\34                       8086,SM,NOX86_64
+mem_offs,reg_al       \1\xA2\44                       8086,SM
 rm8,reg8              \1\x88\101                      8086
-reg_al,mem_offs       \1\xA0\35                       8086,SM,NOX86_64
+reg_al,mem_offs       \1\xA0\45                       8086,SM
 reg8,rm8              \1\x8A\110                      8086,SM
 reg8,imm              \10\xB0\21                      8086,SB
 rm8,imm               \1\xC6\200\21                   8086,SB
@@ -3008,7 +3012,11 @@ void                  \2\x0F\x3A                      P6,CYRIX
 ;
 [MOVABS]
 (Ch_Wop2, Ch_Rop1, Ch_None)
-reg32,imm             \325\10\xB8\41                  X86_64
+reg_al,mem_offs       \1\xA0\45                       X86_64,SM
+reg_ax|32|64,mem_offs \320\1\xA1\45                   X86_64,SM
+mem_offs,reg_al       \1\xA2\44                       X86_64,SM
+mem_offs,reg_ax|32|64 \321\xA3\44                     X86_64,SM
+reg64,imm             \326\10\xB8\55                  X86_64
 
 [MOVSXD,movslq]
 (Ch_Wop2, Ch_Rop1, Ch_None)

+ 1 - 1
compiler/x86_64/x8664nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-1199;
+1212;

+ 95 - 4
compiler/x86_64/x8664tab.inc

@@ -2758,6 +2758,27 @@
     code    : #3#15#1#200;
     flags   : if_prescott
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_ax,ot_none);
+    code    : #212#1#163#36;
+    flags   : if_8086 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_eax,ot_none);
+    code    : #213#1#163#36;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_rax,ot_none);
+    code    : #214#1#163#36;
+    flags   : if_x86_64 or if_sm
+  ),
   (
     opcode  : A_MOV;
     ops     : 2;
@@ -2765,6 +2786,27 @@
     code    : #208#1#137#65;
     flags   : if_8086 or if_sm
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg_ax,ot_mem_offs,ot_none);
+    code    : #212#1#161#37;
+    flags   : if_8086 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg_eax,ot_mem_offs,ot_none);
+    code    : #213#1#161#37;
+    flags   : if_386 or if_sm
+  ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg_rax,ot_mem_offs,ot_none);
+    code    : #214#1#161#37;
+    flags   : if_x86_64 or if_sm
+  ),
   (
     opcode  : A_MOV;
     ops     : 2;
@@ -2775,10 +2817,17 @@
   (
     opcode  : A_MOV;
     ops     : 2;
-    optypes : (ot_reg32 or ot_bits64,ot_immediate,ot_none);
-    code    : #208#8#184#29;
+    optypes : (ot_reg32,ot_immediate,ot_none);
+    code    : #213#8#184#33;
     flags   : if_386 or if_sd
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg64,ot_immediate,ot_none);
+    code    : #214#8#184#45;
+    flags   : if_x86_64 or if_sm
+  ),
   (
     opcode  : A_MOV;
     ops     : 2;
@@ -2807,6 +2856,13 @@
     code    : #212#1#199#128#25;
     flags   : if_8086 or if_sw
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_al,ot_none);
+    code    : #1#162#36;
+    flags   : if_8086 or if_sm
+  ),
   (
     opcode  : A_MOV;
     ops     : 2;
@@ -2814,6 +2870,13 @@
     code    : #1#136#65;
     flags   : if_8086
   ),
+  (
+    opcode  : A_MOV;
+    ops     : 2;
+    optypes : (ot_reg_al,ot_mem_offs,ot_none);
+    code    : #1#160#37;
+    flags   : if_8086 or if_sm
+  ),
   (
     opcode  : A_MOV;
     ops     : 2;
@@ -7563,8 +7626,36 @@
   (
     opcode  : A_MOVABS;
     ops     : 2;
-    optypes : (ot_reg32,ot_immediate,ot_none);
-    code    : #213#8#184#33;
+    optypes : (ot_reg_al,ot_mem_offs,ot_none);
+    code    : #1#160#37;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_MOVABS;
+    ops     : 2;
+    optypes : (ot_reg_ax or ot_bits32 or ot_bits64,ot_mem_offs,ot_none);
+    code    : #208#1#161#37;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_MOVABS;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_al,ot_none);
+    code    : #1#162#36;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_MOVABS;
+    ops     : 2;
+    optypes : (ot_mem_offs,ot_reg_ax or ot_bits32 or ot_bits64,ot_none);
+    code    : #209#163#36;
+    flags   : if_x86_64 or if_sm
+  ),
+  (
+    opcode  : A_MOVABS;
+    ops     : 2;
+    optypes : (ot_reg64,ot_immediate,ot_none);
+    code    : #214#8#184#45;
     flags   : if_x86_64
   ),
   (