Bläddra i källkod

Fix tw22326 for mips CPU

git-svn-id: trunk@22451 -
pierre 13 år sedan
förälder
incheckning
d01ec10f45
1 ändrade filer med 18 tillägg och 15 borttagningar
  1. 18 15
      compiler/mips/ncpumat.pas

+ 18 - 15
compiler/mips/ncpumat.pas

@@ -197,21 +197,24 @@ begin
     end
     end
     else
     else
     begin
     begin
-      hregister := cg.getintregister(current_asmdata.CurrAsmList, OS_32);
-      if nodetype = shln then
-      begin
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, 32 - shiftval, hreg64lo, hregister);
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, shiftval, hreg64hi, hreg64hi);
-        cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList, OP_OR, OS_32, hregister, hreg64hi, hreg64hi);
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, shiftval, hreg64lo, hreg64lo);
-      end
-      else
-      begin
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, 32 - shiftval, hreg64hi, hregister);
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, shiftval, hreg64lo, hreg64lo);
-        cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList, OP_OR, OS_32, hregister, hreg64lo, hreg64lo);
-        cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, shiftval, hreg64hi, hreg64hi);
-      end;
+      if shiftval <> 0 then
+        begin
+          hregister := cg.getintregister(current_asmdata.CurrAsmList, OS_32);
+          if nodetype = shln then
+            begin
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, 32 - shiftval, hreg64lo, hregister);
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, shiftval, hreg64hi, hreg64hi);
+              cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList, OP_OR, OS_32, hregister, hreg64hi, hreg64hi);
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, shiftval, hreg64lo, hreg64lo);
+            end
+          else
+            begin
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_32, 32 - shiftval, hreg64hi, hregister);
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, shiftval, hreg64lo, hreg64lo);
+              cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList, OP_OR, OS_32, hregister, hreg64lo, hreg64lo);
+              cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHR, OS_32, shiftval, hreg64hi, hreg64hi);
+            end;
+        end;
       location.register64.reghi := hreg64hi;
       location.register64.reghi := hreg64hi;
       location.register64.reglo := hreg64lo;
       location.register64.reglo := hreg64lo;
     end;
     end;