mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 12:11:34 +01:00 
			
		
		
		
	* fix for bug0258
This commit is contained in:
		
							parent
							
								
									4fe0f4f1a2
								
							
						
					
					
						commit
						3921a5be23
					
				| @ -90,6 +90,9 @@ implementation | |||||||
|          i,numparts : byte; |          i,numparts : byte; | ||||||
|          {href,href2 : Treference;} |          {href,href2 : Treference;} | ||||||
|          l,l2       : pasmlabel; |          l,l2       : pasmlabel; | ||||||
|  | {$ifdef CORRECT_SET_IN_FPC} | ||||||
|  |          AM         : tasmop; | ||||||
|  | {$endif CORRECT_SET_IN_FPC} | ||||||
| 
 | 
 | ||||||
|          function analizeset(Aset:pconstset;is_small:boolean):boolean; |          function analizeset(Aset:pconstset;is_small:boolean):boolean; | ||||||
|            type |            type | ||||||
| @ -296,7 +299,7 @@ implementation | |||||||
|                     end; |                     end; | ||||||
|                  end; |                  end; | ||||||
|                 { Emit the jump over label } |                 { Emit the jump over label } | ||||||
|                 exprasmlist^.concat(new(pai_label,init(l2))); |                 emitlab(l2); | ||||||
|               end |               end | ||||||
|              else |              else | ||||||
|               begin |               begin | ||||||
| @ -320,7 +323,7 @@ implementation | |||||||
|              { To compensate for not doing a second pass } |              { To compensate for not doing a second pass } | ||||||
|              p^.right^.location.reference.symbol:=nil; |              p^.right^.location.reference.symbol:=nil; | ||||||
|              { Now place the end label } |              { Now place the end label } | ||||||
|              exprasmlist^.concat(new(pai_label,init(l))); |              emitlab(l); | ||||||
|              case p^.left^.location.loc of |              case p^.left^.location.loc of | ||||||
|             LOC_REGISTER, |             LOC_REGISTER, | ||||||
|            LOC_CREGISTER : ungetregister32(pleftreg); |            LOC_CREGISTER : ungetregister32(pleftreg); | ||||||
| @ -403,9 +406,100 @@ implementation | |||||||
|              end |              end | ||||||
|             else |             else | ||||||
|              begin |              begin | ||||||
|  |                if p^.right^.location.reference.is_immediate then | ||||||
|  |                 begin | ||||||
|  |                   p^.location.resflags:=F_C; | ||||||
|  |                   getlabel(l); | ||||||
|  |                   getlabel(l2); | ||||||
|  |                    | ||||||
|  |                   { Is this treated in firstpass ?? } | ||||||
|  |                   if p^.left^.treetype=ordconstn then | ||||||
|  |                     begin | ||||||
|  |                       hr:=getregister32; | ||||||
|  |                       p^.left^.location.loc:=LOC_REGISTER; | ||||||
|  |                       p^.left^.location.register:=hr; | ||||||
|  |                       exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L, | ||||||
|  |                             p^.left^.value,hr))); | ||||||
|  |                     end; | ||||||
|  |                   case p^.left^.location.loc of | ||||||
|  |                      LOC_REGISTER, | ||||||
|  |                      LOC_CREGISTER: | ||||||
|  |                        begin | ||||||
|  |                           hr:=regtoreg32(p^.left^.location.register); | ||||||
|  | {$ifdef CORRECT_SET_IN_FPC} | ||||||
|  |                           if m_tp in aktmodeswitches then | ||||||
|  |                             begin | ||||||
|  |                                if is_signed(p^.left^.resulttype) then | ||||||
|  |                                  AM:=A_MOVSX | ||||||
|  |                                else | ||||||
|  |                                  AM:=A_MOVZX; | ||||||
|  |                                if p^.left^.location.register in [R_AX,R_DI] then | ||||||
|  |                                  exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_WL, | ||||||
|  |                                    p^.left^.location.register,hr))) | ||||||
|  |                                else if p^.left^.location.register in [R_AL,R_DH] then | ||||||
|  |                                exprasmlist^.concat(new(pai386,op_reg_reg(AM,S_BL, | ||||||
|  |                                  p^.left^.location.register,hr))); | ||||||
|  |                             end | ||||||
|  |                           else | ||||||
|  | {$endif CORRECT_SET_IN_FPC} | ||||||
|  |                             begin | ||||||
|  |                                exprasmlist^.concat(new(pai386,op_const_reg(A_AND,S_L, | ||||||
|  |                                  255,hr))); | ||||||
|  |                             end; | ||||||
|  |                           exprasmlist^.concat(new(pai386,op_const_reg(A_CMP,S_L, | ||||||
|  |                             31,hr))); | ||||||
|  |                           emitjmp(C_NA,l); | ||||||
|  |                         { reset carry flag } | ||||||
|  |                           exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO))); | ||||||
|  |                           emitjmp(C_NONE,l2); | ||||||
|  |                           emitlab(l); | ||||||
|  |                         { We have to load the value into a register because | ||||||
|  |                           btl does not accept values only refs or regs (PFV) } | ||||||
|  |                           hr2:=getregister32; | ||||||
|  |                           exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L, | ||||||
|  |                             p^.right^.location.reference.offset,hr2))); | ||||||
|  |                           exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2))); | ||||||
|  |                           ungetregister32(hr2); | ||||||
|  |                        end; | ||||||
|  |                   else | ||||||
|  |                     begin | ||||||
|  | {$ifdef CORRECT_SET_IN_FPC} | ||||||
|  |                           if m_tp in aktmodeswitches then | ||||||
|  |                             begin | ||||||
|  |                             {***WARNING only correct if | ||||||
|  |                               reference is 32 bits (PM) *****} | ||||||
|  |                                exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_L, | ||||||
|  |                                  31,newreference(p^.left^.location.reference)))); | ||||||
|  |                             end | ||||||
|  |                           else | ||||||
|  | {$endif CORRECT_SET_IN_FPC} | ||||||
|  |                             begin | ||||||
|  |                                exprasmlist^.concat(new(pai386,op_const_ref(A_CMP,S_B, | ||||||
|  |                                  31,newreference(p^.left^.location.reference)))); | ||||||
|  |                             end; | ||||||
|  |                        emitjmp(C_NA,l); | ||||||
|  |                      { reset carry flag } | ||||||
|  |                        exprasmlist^.concat(new(pai386,op_none(A_CLC,S_NO))); | ||||||
|  |                        emitjmp(C_NONE,l2); | ||||||
|  |                        emitlab(l); | ||||||
|  |                        hr:=getregister32; | ||||||
|  |                        exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L, | ||||||
|  |                          newreference(p^.left^.location.reference),hr))); | ||||||
|  |                      { We have to load the value into a register because | ||||||
|  |                        btl does not accept values only refs or regs (PFV) } | ||||||
|  |                        hr2:=getregister32; | ||||||
|  |                        exprasmlist^.concat(new(pai386,op_const_reg(A_MOV,S_L, | ||||||
|  |                          p^.right^.location.reference.offset,hr2))); | ||||||
|  |                        exprasmlist^.concat(new(pai386,op_reg_reg(A_BT,S_L,hr,hr2))); | ||||||
|  |                        ungetregister32(hr2); | ||||||
|  |                       del_reference(p^.left^.location.reference); | ||||||
|  |                     end; | ||||||
|  |                     emitlab(l2); | ||||||
|  |                   end; | ||||||
|  |                 end { of p^.right^.location.reference.is_immediate } | ||||||
|                { do search in a normal set which could have >32 elementsm |                { do search in a normal set which could have >32 elementsm | ||||||
|                  but also used if the left side contains higher values > 32 } |                  but also used if the left side contains higher values > 32 } | ||||||
|                if p^.left^.treetype=ordconstn then |                else if p^.left^.treetype=ordconstn then | ||||||
|                 begin |                 begin | ||||||
|                   p^.location.resflags:=F_NE; |                   p^.location.resflags:=F_NE; | ||||||
|                   inc(p^.right^.location.reference.offset,p^.left^.value shr 3); |                   inc(p^.right^.location.reference.offset,p^.left^.value shr 3); | ||||||
| @ -816,7 +910,10 @@ implementation | |||||||
| end. | end. | ||||||
| { | { | ||||||
|   $Log$ |   $Log$ | ||||||
|   Revision 1.33  1999-06-02 10:11:48  florian |   Revision 1.34  1999-06-08 15:27:24  pierre | ||||||
|  |    * fix for bug0258 | ||||||
|  | 
 | ||||||
|  |   Revision 1.33  1999/06/02 10:11:48  florian | ||||||
|     * make cycle fixed i.e. compilation with 0.99.10 |     * make cycle fixed i.e. compilation with 0.99.10 | ||||||
|     * some fixes for qword |     * some fixes for qword | ||||||
|     * start of register calling conventions |     * start of register calling conventions | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 pierre
						pierre