Explorar o código

Fix loading of 64-bit constant into register for 64-bit mips CPU

Pierre Muller %!s(int64=3) %!d(string=hai) anos
pai
achega
b048ae37b2
Modificáronse 1 ficheiros con 18 adicións e 0 borrados
  1. 18 0
      compiler/mips/cgcpu.pas

+ 18 - 0
compiler/mips/cgcpu.pas

@@ -440,11 +440,29 @@ begin
     list.concat(taicpu.op_reg_reg_const(A_ADDIU, reg, NR_R0, a))
     list.concat(taicpu.op_reg_reg_const(A_ADDIU, reg, NR_R0, a))
   else if (a>=0) and (a <= 65535) then
   else if (a>=0) and (a <= 65535) then
     list.concat(taicpu.op_reg_reg_const(A_ORI, reg, NR_R0, a))
     list.concat(taicpu.op_reg_reg_const(A_ORI, reg, NR_R0, a))
+{$ifdef mips32}
   else
   else
+{$else}
+  else if (a>=0) and (a <= high(dword)) then
+{$endif}
     begin
     begin
       list.concat(taicpu.op_reg_const(A_LUI, reg, aint(a) shr 16));
       list.concat(taicpu.op_reg_const(A_LUI, reg, aint(a) shr 16));
       if (a and aint($FFFF))<>0 then
       if (a and aint($FFFF))<>0 then
         list.concat(taicpu.op_reg_reg_const(A_ORI,reg,reg,a and aint($FFFF)));
         list.concat(taicpu.op_reg_reg_const(A_ORI,reg,reg,a and aint($FFFF)));
+{$ifdef mips64}
+    end
+  else
+    begin
+      list.concat(taicpu.op_reg_const(A_LUI, reg, aint(a) shr 48));
+      if ((a shr 32) and aint($FFFF))<>0 then
+        list.concat(taicpu.op_reg_reg_const(A_ORI,reg,reg,(a shr 32) and aint($FFFF)));
+      list.concat(taicpu.op_reg_const(A_SLL, reg, 16));
+      if ((a shr 16) and aint($FFFF))<>0 then
+        list.concat(taicpu.op_reg_reg_const(A_ORI,reg,reg,(a shr 16) and aint($FFFF)));
+      list.concat(taicpu.op_reg_const(A_SLL, reg, 16));
+      if (a and aint($FFFF))<>0 then
+        list.concat(taicpu.op_reg_reg_const(A_ORI,reg,reg,a  and aint($FFFF)));
+{$endif mips64}
     end;
     end;
 end;
 end;