Explorar o código

+ implement tcg.a_load_cgparaloc_ref for un-even sizes and little endian systems as well

git-svn-id: trunk@36977 -
florian %!s(int64=8) %!d(string=hai) anos
pai
achega
4a54a88cca
Modificáronse 1 ficheiros con 33 adicións e 8 borrados
  1. 33 8
      compiler/cgobj.pas

+ 33 - 8
compiler/cgobj.pas

@@ -1131,8 +1131,13 @@ implementation
                           a_load_reg_ref(list,paraloc.size,OS_16,hreg,ref);
                           a_load_reg_ref(list,paraloc.size,OS_16,hreg,ref);
                         end
                         end
                       else
                       else
-                        { little endian not implemented yet }
-                        Internalerror(2017081301);
+                        begin
+                          a_load_reg_ref(list,paraloc.size,OS_16,hreg,ref);
+                          href:=ref;
+                          inc(href.offset,2);
+                          a_op_const_reg_reg(list,OP_SHR,cgsize,16,hreg,hreg);
+                          a_load_reg_ref(list,paraloc.size,OS_8,hreg,href);
+                        end
                     end;
                     end;
                   5:
                   5:
                     begin
                     begin
@@ -1145,8 +1150,13 @@ implementation
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                         end
                         end
                       else
                       else
-                        { little endian not implemented yet }
-                        Internalerror(2017081302);
+                       begin
+                          a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
+                          href:=ref;
+                          inc(href.offset,4);
+                          a_op_const_reg_reg(list,OP_SHR,cgsize,32,hreg,hreg);
+                          a_load_reg_ref(list,paraloc.size,OS_8,hreg,href);
+                        end
                     end;
                     end;
                   6:
                   6:
                     begin
                     begin
@@ -1159,8 +1169,13 @@ implementation
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                         end
                         end
                       else
                       else
-                        { little endian not implemented yet }
-                        Internalerror(2017081303);
+                       begin
+                          a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
+                          href:=ref;
+                          inc(href.offset,4);
+                          a_op_const_reg_reg(list,OP_SHR,cgsize,32,hreg,hreg);
+                          a_load_reg_ref(list,paraloc.size,OS_16,hreg,href);
+                        end
                     end;
                     end;
                   7:
                   7:
                     begin
                     begin
@@ -1179,8 +1194,18 @@ implementation
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                           a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
                         end
                         end
                       else
                       else
-                        { little endian not implemented yet }
-                        Internalerror(2017081304);
+                       begin
+                          a_load_reg_ref(list,paraloc.size,OS_32,hreg,ref);
+
+                          href:=ref;
+                          inc(href.offset,4);
+                          a_op_const_reg_reg(list,OP_SHR,cgsize,32,hreg,hreg);
+                          a_load_reg_ref(list,paraloc.size,OS_16,hreg,href);
+
+                          inc(href.offset,4);
+                          a_op_const_reg_reg(list,OP_SHR,cgsize,16,hreg,hreg);
+                          a_load_reg_ref(list,paraloc.size,OS_8,hreg,href);
+                        end
                     end;
                     end;
                   else
                   else
                     { other sizes not allowed }
                     { other sizes not allowed }