Browse Source

* another improvement to tcginnode.pass_2

florian 21 years ago
parent
commit
001e65a94e
1 changed files with 30 additions and 16 deletions
  1. 30 16
      compiler/ncgset.pas

+ 30 - 16
compiler/ncgset.pas

@@ -140,11 +140,23 @@ implementation
       { be caught when range checking is on! (JM)                        }
       { cg.a_op_const_reg(list,OP_AND,31,bitnumber);                     }
 
-      { rotate value register "bitnumber" bits to the right }
-      cg.a_op_reg_reg(list,OP_SHR,bitsize,bitnumber,value);
-      { extract the bit we want }
-      cg.a_op_const_reg(list,OP_AND,bitsize,1,value);
-      cg.a_load_reg_reg(list,bitsize,ressize,value,res);
+      if bitsize<>ressize then
+        begin
+          { FIX ME! We're not allowed to modify the value register here! }
+
+          { shift value register "bitnumber" bits to the right }
+          cg.a_op_reg_reg(list,OP_SHR,bitsize,bitnumber,value);
+          { extract the bit we want }
+          cg.a_op_const_reg(list,OP_AND,bitsize,1,value);
+          cg.a_load_reg_reg(list,bitsize,ressize,value,res);
+        end
+      else
+        begin
+          { rotate value register "bitnumber" bits to the right }
+          cg.a_op_reg_reg_reg(list,OP_SHR,OS_32,bitnumber,value,res);
+          { extract the bit we want }
+          cg.a_op_const_reg(list,OP_AND,OS_32,1,res);
+        end;
     end;
 
 
@@ -471,13 +483,12 @@ implementation
                 end
                else
                 begin
-                  location_force_reg(exprasmlist,left.location,OS_32,true);
+                  location_force_reg(exprasmlist,left.location,OS_INT,true);
                   pleftreg := left.location.register;
 
                   location_freetemp(exprasmlist,left.location);
-                  cg.a_op_const_reg(exprasmlist,OP_SHR,OS_32,5,pleftreg);
                   hr := cg.getaddressregister(exprasmlist);
-                  cg.a_load_reg_reg(exprasmlist,OS_32,OS_ADDR,pleftreg,hr);
+                  cg.a_op_const_reg_reg(exprasmlist,OP_SHR,OS_ADDR,5,pleftreg,hr);
                   cg.a_op_const_reg(exprasmlist,OP_SHL,OS_ADDR,2,hr);
 
                   href := right.location.reference;
@@ -495,15 +506,15 @@ implementation
                     end;
                   reference_release(exprasmlist,href);
                   { allocate a register for the result }
-                  hr := cg.getintregister(exprasmlist,OS_32);
-                  cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,hr);
-                  cg.a_op_const_reg(exprasmlist,OP_AND,OS_32,31,pleftreg);
-                  cg.a_op_reg_reg(exprasmlist,OP_SHR,OS_32,pleftreg,hr);
+                  location.register := cg.getintregister(exprasmlist,OS_INT);
+                  cg.a_load_ref_reg(exprasmlist,OS_32,OS_INT,href,location.register);
+
                   cg.ungetregister(exprasmlist,pleftreg);
-                  cg.a_op_const_reg(exprasmlist,OP_AND,OS_32,1,hr);
-                  location.register := cg.getintregister(exprasmlist,location.size);
-                  cg.a_load_reg_reg(exprasmlist,OS_32,location.size,hr,location.register);
+                  hr := cg.getintregister(exprasmlist,OS_INT);
+                  cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_INT,31,pleftreg,hr);
+                  cg.a_op_reg_reg(exprasmlist,OP_SHR,OS_INT,hr,location.register);
                   cg.ungetregister(exprasmlist,hr);
+                  cg.a_op_const_reg(exprasmlist,OP_AND,OS_INT,1,location.register);
                 end;
              end;
           end;
@@ -997,7 +1008,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.56  2004-01-31 17:45:17  peter
+  Revision 1.57  2004-01-31 23:37:07  florian
+    * another improvement to tcginnode.pass_2
+
+  Revision 1.56  2004/01/31 17:45:17  peter
     * Change several $ifdef i386 to x86
     * Change several OS_32 to OS_INT/OS_ADDR