2
0
Эх сурвалжийг харах

* fixed web bug #4228 (support loading int64 paras passed on the stack into
local regvars)

git-svn-id: trunk@1380 -

Jonas Maebe 20 жил өмнө
parent
commit
00b612502e

+ 1 - 0
.gitattributes

@@ -6318,6 +6318,7 @@ tests/webtbs/tw4350.pp svneol=native#text/plain
 tests/webtbs/tw4388.pp svneol=native#text/plain
 tests/webtbs/tw4388.pp svneol=native#text/plain
 tests/webtbs/tw4390.pp svneol=native#text/plain
 tests/webtbs/tw4390.pp svneol=native#text/plain
 tests/webtbs/tw4398.pp svneol=native#text/plain
 tests/webtbs/tw4398.pp svneol=native#text/plain
+tests/webtbs/tw4428.pp svneol=native#text/plain
 tests/webtbs/ub1873.pp svneol=native#text/plain
 tests/webtbs/ub1873.pp svneol=native#text/plain
 tests/webtbs/ub1883.pp svneol=native#text/plain
 tests/webtbs/ub1883.pp svneol=native#text/plain
 tests/webtbs/uw0555.pp svneol=native#text/plain
 tests/webtbs/uw0555.pp svneol=native#text/plain

+ 33 - 20
compiler/ncgutil.pas

@@ -1407,26 +1407,39 @@ implementation
                   if (currpara.paraloc[calleeside].size in [OS_64,OS_S64]) and
                   if (currpara.paraloc[calleeside].size in [OS_64,OS_S64]) and
                      is_64bit(currpara.vartype.def) then
                      is_64bit(currpara.vartype.def) then
                     begin
                     begin
-                      if not assigned(paraloc^.next) then
-                        internalerror(200410104);
-                      if (target_info.endian=ENDIAN_BIG) then
-                        begin
-                          { paraloc^ -> high
-                            paraloc^.next -> low }
-                          unget_para(paraloc^);
-                          gen_load_reg(paraloc^,currpara.localloc.register64.reghi);
-                          unget_para(paraloc^.next^);
-                          gen_load_reg(paraloc^.next^,currpara.localloc.register64.reglo);
-                        end
-                      else
-                        begin
-                          { paraloc^ -> low
-                            paraloc^.next -> high }
-                          unget_para(paraloc^);
-                          gen_load_reg(paraloc^,currpara.localloc.register64.reglo);
-                          unget_para(paraloc^.next^);
-                          gen_load_reg(paraloc^.next^,currpara.localloc.register64.reghi);
-                        end;
+                      case paraloc^.loc of
+                        LOC_REGISTER:
+                          begin
+                            if not assigned(paraloc^.next) then
+                              internalerror(200410104);
+                            if (target_info.endian=ENDIAN_BIG) then
+                              begin
+                                { paraloc^ -> high
+                                  paraloc^.next -> low }
+                                unget_para(paraloc^);
+                                gen_load_reg(paraloc^,currpara.localloc.register64.reghi);
+                                unget_para(paraloc^.next^);
+                                gen_load_reg(paraloc^.next^,currpara.localloc.register64.reglo);
+                              end
+                            else
+                              begin
+                                { paraloc^ -> low
+                                  paraloc^.next -> high }
+                                unget_para(paraloc^);
+                                gen_load_reg(paraloc^,currpara.localloc.register64.reglo);
+                                unget_para(paraloc^.next^);
+                                gen_load_reg(paraloc^.next^,currpara.localloc.register64.reghi);
+                              end;
+                          end;
+                        LOC_REFERENCE:
+                          begin
+                            reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset);
+                            cg64.a_load64_ref_reg(list,href,currpara.localloc.register64);
+                            unget_para(paraloc^);
+                          end;
+                        else
+                          internalerror(2005101501);
+                      end
                     end
                     end
                   else
                   else
 {$endif cpu64bit}
 {$endif cpu64bit}

+ 11 - 0
tests/webtbs/tw4428.pp

@@ -0,0 +1,11 @@
+{ %OPT=-Or}
+
+procedure p(i1,i2,i3,i4,i5,i6,i7,i8 : longint;i : int64);
+  begin
+    if (i+i <> 22222222222) then
+      halt(1);
+  end;
+
+begin
+  p(1,2,3,4,5,6,7,8,11111111111)
+end.