Ver código fonte

* fixed opsize and operand size setting for 64bit values

peter 22 anos atrás
pai
commit
9cafe9c315
1 arquivos alterados com 30 adições e 16 exclusões
  1. 30 16
      compiler/x86/rax86.pas

+ 30 - 16
compiler/x86/rax86.pas

@@ -88,7 +88,7 @@ implementation
 
 uses
   globtype,globals,systems,verbose,
-  cpuinfo,
+  cpuinfo,cginfo,
   itx86att,cgx86;
 
 {$define ATTOP}
@@ -203,6 +203,8 @@ end;
 Procedure T386Operand.SetSize(_size:longint;force:boolean);
 begin
   inherited SetSize(_size,force);
+  { OS_64 will be set to S_L and be fixed later
+    in SetCorrectSize }
   opsize:=TCGSize2Opsize[size];
 end;
 
@@ -211,16 +213,17 @@ Procedure T386Operand.SetCorrectSize(opcode:tasmop);
 begin
   if gas_needsuffix[opcode]=attsufFPU then
     begin
-     case opsize of
-      S_L : opsize:=S_FS;
-      S_IQ : opsize:=S_FL;
+     case size of
+       OS_32 : opsize:=S_FS;
+       OS_64 : opsize:=S_FL;
      end;
     end
   else if gas_needsuffix[opcode]=attsufFPUint then
     begin
-      case opsize of
-        S_W : opsize:=S_IS;
-        S_L : opsize:=S_IL;
+      case size of
+        OS_16 : opsize:=S_IS;
+        OS_32 : opsize:=S_IL;
+        OS_64 : opsize:=S_IQ;
       end;
     end;
 end;
@@ -656,19 +659,27 @@ begin
        OPR_REFERENCE:
          begin
            ai.loadref(i-1,operands[i].opr.ref);
-           if t386operand(operands[i]).opsize<>S_NO then
+           if operands[i].size<>OS_NO then
              begin
                asize:=0;
-               case t386operand(operands[i]).opsize of
-                   S_B :
+               case operands[i].size of
+                   OS_8,OS_S8 :
                      asize:=OT_BITS8;
-                   S_W, S_IS :
+                   OS_16,OS_S16 :
                      asize:=OT_BITS16;
-                   S_L, S_IL, S_FS:
-                     asize:=OT_BITS32;
-                   S_Q, S_D, S_FL, S_FV :
+                   OS_32,OS_S32,OS_F32,
+                   OS_64,OS_S64:
+                     begin
+                       { Only FPU operations know about 64bit values, for all
+                         integer operations it is seen as 32bit }
+                       if gas_needsuffix[opcode] in [attsufFPU,attsufFPUint] then
+                         asize:=OT_BITS64
+                       else
+                         asize:=OT_BITS32;
+                     end;
+                   OS_F64,OS_C64 :
                      asize:=OT_BITS64;
-                   S_FX :
+                   OS_F80 :
                      asize:=OT_BITS80;
                  end;
                if asize<>0 then
@@ -704,7 +715,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.3  2003-05-30 23:57:08  peter
+  Revision 1.4  2003-05-31 16:22:28  peter
+    * fixed opsize and operand size setting for 64bit values
+
+  Revision 1.3  2003/05/30 23:57:08  peter
     * more sparc cleanup
     * accumulator removed, splitted in function_return_reg (called) and
       function_result_reg (caller)