mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-30 17:51:32 +01:00 
			
		
		
		
	* -Or fixes
This commit is contained in:
		
							parent
							
								
									fd759e521f
								
							
						
					
					
						commit
						30d25d1d2b
					
				| @ -483,6 +483,7 @@ unit cgx86; | ||||
|       var | ||||
|         op: tasmop; | ||||
|         s: topsize; | ||||
|         tmpsize : tcgsize; | ||||
|         tmpreg : tregister; | ||||
|       begin | ||||
|         check_register_size(fromsize,reg); | ||||
| @ -499,10 +500,15 @@ unit cgx86; | ||||
|                 which clears the upper 64 bit too, so it could be that s is S_L while the reg is | ||||
|                 64 bit (FK) } | ||||
|               if s in [S_BL,S_WL,S_L] then | ||||
|                 tmpreg:=makeregsize(list,tmpreg,OS_32); | ||||
|                 begin | ||||
|                   tmpreg:=makeregsize(list,tmpreg,OS_32); | ||||
|                   tmpsize:=OS_32; | ||||
|                 end | ||||
|               else | ||||
|                 tmpsize:=tosize; | ||||
| {$endif x86_64} | ||||
|               list.concat(taicpu.op_reg_reg(op,s,reg,tmpreg)); | ||||
|               a_load_reg_ref(list,tosize,tosize,tmpreg,ref); | ||||
|               a_load_reg_ref(list,tmpsize,tosize,tmpreg,ref); | ||||
|             end; | ||||
|         else | ||||
|           list.concat(taicpu.op_reg_ref(op,s,reg,ref)); | ||||
| @ -1674,7 +1680,10 @@ unit cgx86; | ||||
| end. | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.130  2004-10-24 11:44:28  peter | ||||
|   Revision 1.131  2004-10-24 20:10:08  peter | ||||
|     * -Or fixes | ||||
| 
 | ||||
|   Revision 1.130  2004/10/24 11:44:28  peter | ||||
|     * small regvar fixes | ||||
|     * loadref parameter removed from concatcopy,incrrefcount,etc | ||||
| 
 | ||||
|  | ||||
| @ -46,8 +46,8 @@ implementation | ||||
|       aasmbase,aasmtai,aasmcpu, | ||||
|       cgbase,pass_2, | ||||
|       ncon, | ||||
|       cpubase,cpuinfo,procinfo, | ||||
|       cga,cgutils,cgobj,ncgutil, | ||||
|       cpubase, | ||||
|       cga,cgobj,ncgutil, | ||||
|       cgx86; | ||||
| 
 | ||||
| {***************************************************************************** | ||||
| @ -85,15 +85,13 @@ implementation | ||||
|          genjumps, | ||||
|          use_small, | ||||
|          ranges     : boolean; | ||||
|          hr,hr2, | ||||
|          hreg,hreg2, | ||||
|          pleftreg   : tregister; | ||||
|          href       : treference; | ||||
|          opsize     : tcgsize; | ||||
|          setparts   : array[1..8] of Tsetpart; | ||||
|          i,numparts : byte; | ||||
|          adjustment : longint; | ||||
|          l,l2       : tasmlabel; | ||||
|          r          : Tregister; | ||||
| {$ifdef CORRECT_SET_IN_FPC} | ||||
|          AM         : tasmop; | ||||
| {$endif CORRECT_SET_IN_FPC} | ||||
| @ -244,7 +242,6 @@ implementation | ||||
|             { "x in [y..z]" expression                               } | ||||
|             adjustment := 0; | ||||
| 
 | ||||
|             r:=NR_NO; | ||||
|             for i:=1 to numparts do | ||||
|              if setparts[i].range then | ||||
|               { use fact that a <= x <= b <=> cardinal(x-a) <= cardinal(b-a) } | ||||
| @ -254,26 +251,17 @@ implementation | ||||
|                   begin | ||||
|                     { yes, is the lower bound <> 0? } | ||||
|                     if (setparts[i].start <> 0) then | ||||
|                       { we're going to substract from the left register,   } | ||||
|                       { so in case of a LOC_CREGISTER first move the value } | ||||
|                       { to edi (not done before because now we can do the  } | ||||
|                       { move and substract in one instruction with LEA)    } | ||||
|                       if (left.location.loc = LOC_CREGISTER) then | ||||
|                         begin | ||||
|                           r:=cg.getintregister(exprasmlist,OS_32); | ||||
|                           reference_reset_base(href,pleftreg,-setparts[i].start); | ||||
|                           cg.a_loadaddr_ref_reg(exprasmlist,href,r); | ||||
|                           { only now change pleftreg since previous value is } | ||||
|                           { still used in previous instruction               } | ||||
|                           pleftreg := r; | ||||
|                           opsize := OS_32; | ||||
|                         end | ||||
|                       else | ||||
|                         begin | ||||
|                           { otherwise, the value is already in a register   } | ||||
|                           { that can be modified                            } | ||||
|                           cg.a_op_const_reg(exprasmlist,OP_SUB,opsize,setparts[i].start-adjustment,pleftreg); | ||||
|                         end; | ||||
|                       begin | ||||
|                         if (left.location.loc = LOC_CREGISTER) then | ||||
|                           begin | ||||
|                             hreg:=cg.getintregister(exprasmlist,OS_INT); | ||||
|                             cg.a_load_reg_reg(exprasmlist,opsize,OS_INT,pleftreg,hreg); | ||||
|                             pleftreg:=hreg; | ||||
|                             opsize:=OS_INT; | ||||
|                           end; | ||||
|                         cg.a_op_const_reg(exprasmlist,OP_SUB,opsize,setparts[i].start-adjustment,pleftreg); | ||||
|                       end; | ||||
| 
 | ||||
|                     { new total value substracted from x:           } | ||||
|                     { adjustment + (setparts[i].start - adjustment) } | ||||
|                     adjustment := setparts[i].start; | ||||
| @ -347,16 +335,16 @@ implementation | ||||
|                      LOC_REGISTER, | ||||
|                      LOC_CREGISTER: | ||||
|                        begin | ||||
|                           hr:=cg.makeregsize(exprasmlist,left.location.register,OS_32); | ||||
|                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hr); | ||||
|                           hreg:=cg.makeregsize(exprasmlist,left.location.register,OS_32); | ||||
|                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hreg); | ||||
|                        end; | ||||
|                   else | ||||
|                     begin | ||||
|                       { the set element isn't never samller than a byte | ||||
|                         and because it's a small set we need only 5 bits | ||||
|                         but 8 bits are easier to load                    } | ||||
|                       hr:=cg.getintregister(exprasmlist,OS_32); | ||||
|                       cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,hr); | ||||
|                       hreg:=cg.getintregister(exprasmlist,OS_32); | ||||
|                       cg.a_load_ref_reg(exprasmlist,OS_8,OS_32,left.location.reference,hreg); | ||||
|                     end; | ||||
|                   end; | ||||
| 
 | ||||
| @ -364,20 +352,20 @@ implementation | ||||
|                     LOC_REGISTER, | ||||
|                     LOC_CREGISTER : | ||||
|                       begin | ||||
|                         emit_reg_reg(A_BT,S_L,hr,right.location.register); | ||||
|                         emit_reg_reg(A_BT,S_L,hreg,right.location.register); | ||||
|                       end; | ||||
|                      LOC_CONSTANT : | ||||
|                        begin | ||||
|                          { We have to load the value into a register because | ||||
|                             btl does not accept values only refs or regs (PFV) } | ||||
|                          hr2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                          cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2); | ||||
|                          emit_reg_reg(A_BT,S_L,hr,hr2); | ||||
|                          hreg2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                          cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hreg2); | ||||
|                          emit_reg_reg(A_BT,S_L,hreg,hreg2); | ||||
|                        end; | ||||
|                      LOC_CREFERENCE, | ||||
|                      LOC_REFERENCE : | ||||
|                        begin | ||||
|                          emit_reg_ref(A_BT,S_L,hr,right.location.reference); | ||||
|                          emit_reg_ref(A_BT,S_L,hreg,right.location.reference); | ||||
|                        end; | ||||
|                      else | ||||
|                        internalerror(2002032210); | ||||
| @ -401,18 +389,18 @@ implementation | ||||
|                      LOC_REGISTER, | ||||
|                      LOC_CREGISTER: | ||||
|                        begin | ||||
|                           hr:=cg.makeregsize(exprasmlist,left.location.register,OS_32); | ||||
|                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hr); | ||||
|                           cg.a_cmp_const_reg_label(exprasmlist,OS_32,OC_BE,31,hr,l); | ||||
|                           hreg:=cg.makeregsize(exprasmlist,left.location.register,OS_32); | ||||
|                           cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hreg); | ||||
|                           cg.a_cmp_const_reg_label(exprasmlist,OS_32,OC_BE,31,hreg,l); | ||||
|                           { reset carry flag } | ||||
|                           exprasmlist.concat(taicpu.op_none(A_CLC,S_NO)); | ||||
|                           cg.a_jmp_always(exprasmlist,l2); | ||||
|                           cg.a_label(exprasmlist,l); | ||||
|                           { We have to load the value into a register because | ||||
|                             btl does not accept values only refs or regs (PFV) } | ||||
|                           hr2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                           cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2); | ||||
|                           emit_reg_reg(A_BT,S_L,hr,hr2); | ||||
|                           hreg2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                           cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hreg2); | ||||
|                           emit_reg_reg(A_BT,S_L,hreg,hreg2); | ||||
|                        end; | ||||
|                   else | ||||
|                     begin | ||||
| @ -433,13 +421,13 @@ implementation | ||||
|                        exprasmlist.concat(taicpu.op_none(A_CLC,S_NO)); | ||||
|                        cg.a_jmp_always(exprasmlist,l2); | ||||
|                        cg.a_label(exprasmlist,l); | ||||
|                        hr:=cg.getintregister(exprasmlist,OS_32); | ||||
|                        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hr); | ||||
|                        hreg:=cg.getintregister(exprasmlist,OS_32); | ||||
|                        cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hreg); | ||||
|                        { We have to load the value into a register because | ||||
|                          btl does not accept values only refs or regs (PFV) } | ||||
|                        hr2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                        cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hr2); | ||||
|                        emit_reg_reg(A_BT,S_L,hr,hr2); | ||||
|                        hreg2:=cg.getintregister(exprasmlist,OS_32); | ||||
|                        cg.a_load_const_reg(exprasmlist,OS_32,right.location.value,hreg2); | ||||
|                        emit_reg_reg(A_BT,S_L,hreg,hreg2); | ||||
|                     end; | ||||
|                   end; | ||||
|                   cg.a_label(exprasmlist,l2); | ||||
| @ -475,7 +463,10 @@ begin | ||||
| end. | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.6  2004-10-01 17:32:16  peter | ||||
|   Revision 1.7  2004-10-24 20:10:08  peter | ||||
|     * -Or fixes | ||||
| 
 | ||||
|   Revision 1.6  2004/10/01 17:32:16  peter | ||||
|     * fix resizing of LOC_CREGISTER | ||||
| 
 | ||||
|   Revision 1.5  2004/09/25 14:23:55  peter | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 peter
						peter