Explorar el Código

+ TCGSparc64.a_load_reg_ref_unaligned

git-svn-id: trunk@36763 -
florian hace 8 años
padre
commit
7ed3757f8c
Se han modificado 1 ficheros con 28 adiciones y 0 borrados
  1. 28 0
      compiler/sparc64/cgcpu.pas

+ 28 - 0
compiler/sparc64/cgcpu.pas

@@ -38,6 +38,7 @@ interface
       TCGSparc64=class(TCGSparcGen)
        procedure a_load_reg_reg(list : TAsmList; fromsize,tosize : tcgsize; reg1,reg2 : tregister);override;
        procedure a_load_ref_reg_unaligned(list : TAsmList; fromsize,tosize : tcgsize; const ref : treference; register : tregister);override;
+       procedure a_load_reg_ref_unaligned(list : TAsmList; fromsize,tosize : tcgsize; register : tregister; const ref : treference);override;
        procedure a_load_const_reg(list : TAsmList; size : TCGSize; a : tcgint; reg : TRegister);override;
       end;
 
@@ -132,6 +133,33 @@ interface
       end;
 
 
+    procedure TCGSparc64.a_load_reg_ref_unaligned(list : TAsmList;fromsize,tosize : tcgsize;register : tregister;const ref : treference);
+      var
+        href: treference;
+        hreg1: tregister;
+      begin
+        if fromsize in [OS_64,OS_S64] then
+          begin
+            { split into two 32 bit stores }
+            href:=ref;
+            if not(TCGSparc64(cg).IsSimpleRef(href)) then
+              begin
+                hreg1:=getintregister(list,OS_ADDR);
+                a_loadaddr_ref_reg(list,href,hreg1);
+                reference_reset_base(href,hreg1,0,href.alignment,href.volatility);
+              end;
+            inc(href.offset,4);
+            a_load_reg_ref(list,OS_32,OS_32,register,href);
+            hreg1:=getintregister(list,OS_32);
+            a_op_const_reg_reg(list,OP_SHR,OS_64,32,register,hreg1);
+            dec(href.offset,4);
+            a_load_reg_ref(list,OS_32,OS_32,hreg1,href);
+          end
+       else
+         inherited;
+      end;
+
+
     procedure TCGSparc64.a_load_const_reg(list : TAsmList;size : TCGSize;a : tcgint;reg : TRegister);
       var
         hreg : TRegister;