Sfoglia il codice sorgente

+ added a Z80-specific override for tcgz80.a_loadfpu_ref_cgpara, to support returning single results
in registers

git-svn-id: branches/z80@45024 -

nickysn 5 anni fa
parent
commit
89b8bd3848
1 ha cambiato i file con 38 aggiunte e 0 eliminazioni
  1. 38 0
      compiler/z80/cgcpu.pas

+ 38 - 0
compiler/z80/cgcpu.pas

@@ -58,6 +58,8 @@ unit cgcpu;
         procedure a_loadaddr_ref_cgpara(list : TAsmList;const r : treference;const paraloc : TCGPara);override;
         procedure a_load_reg_cgpara(list : TAsmList; size : tcgsize;r : tregister; const cgpara : tcgpara);override;
 
+        procedure a_loadfpu_ref_cgpara(list : TAsmList;size : tcgsize;const ref : treference;const cgpara : TCGPara);override;
+
         procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override;
         procedure a_call_reg(list : TAsmList;reg: tregister);override;
 
@@ -364,6 +366,42 @@ unit cgcpu;
       end;
 
 
+    procedure tcgz80.a_loadfpu_ref_cgpara(list: TAsmList; size: tcgsize; const ref: treference; const cgpara: TCGPara);
+      var
+        href: treference;
+        curloc: PCGParaLocation;
+        i: Integer;
+      begin
+        case cgpara.location^.loc of
+          LOC_REGISTER,LOC_CREGISTER:
+            begin
+              case size of
+                OS_F32:
+                  begin
+                    curloc:=cgpara.location;
+                    href:=ref;
+                    for i:=1 to 4 do
+                      begin
+                        if not assigned(curloc) then
+                          internalerror(2020042303);
+                        if not (curloc^.Loc in [LOC_REGISTER,LOC_CREGISTER]) then
+                          internalerror(2020042304);
+                        a_load_ref_reg(list,OS_8,OS_8,href,curloc^.register);
+                        curloc:=curloc^.Next;
+                      end;
+                    if assigned(curloc) then
+                      internalerror(2020042305);
+                  end;
+                else
+                  internalerror(2020042302);
+              end;
+            end;
+          else
+            inherited;
+        end;
+      end;
+
+
     procedure tcgz80.a_load_const_cgpara(list : TAsmList;size : tcgsize;a : tcgint;const paraloc : TCGPara);
       var
         i : longint;