|
@@ -119,16 +119,108 @@ implementation
|
|
|
|
|
|
|
|
|
procedure tarmtypeconvnode.second_int_to_bool;
|
|
|
+ var
|
|
|
+ hregister : tregister;
|
|
|
+ href : treference;
|
|
|
+ resflags : tresflags;
|
|
|
+ hlabel,oldtruelabel,oldfalselabel : tasmlabel;
|
|
|
begin
|
|
|
+ oldtruelabel:=truelabel;
|
|
|
+ oldfalselabel:=falselabel;
|
|
|
+ objectlibrary.getlabel(truelabel);
|
|
|
+ objectlibrary.getlabel(falselabel);
|
|
|
+ secondpass(left);
|
|
|
+ if codegenerror then
|
|
|
+ exit;
|
|
|
+ { byte(boolean) or word(wordbool) or longint(longbool) must
|
|
|
+ be accepted for var parameters }
|
|
|
+ if (nf_explicit in flags) and
|
|
|
+ (left.resulttype.def.size=resulttype.def.size) and
|
|
|
+ (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_CREGISTER]) then
|
|
|
+ begin
|
|
|
+ location_copy(location,left.location);
|
|
|
+ truelabel:=oldtruelabel;
|
|
|
+ falselabel:=oldfalselabel;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { Load left node into flag F_NE/F_E }
|
|
|
+ resflags:=F_NE;
|
|
|
+ case left.location.loc of
|
|
|
+ LOC_CREFERENCE,
|
|
|
+ LOC_REFERENCE :
|
|
|
+ begin
|
|
|
+ if left.location.size in [OS_64,OS_S64] then
|
|
|
+ begin
|
|
|
+ location_release(exprasmlist,left.location);
|
|
|
+ hregister:=cg.getintregister(exprasmlist,OS_INT);
|
|
|
+ cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,left.location.reference,hregister);
|
|
|
+ href:=left.location.reference;
|
|
|
+ inc(href.offset,4);
|
|
|
+ cg.ungetregister(exprasmlist,hregister);
|
|
|
+ cg.a_op_ref_reg(exprasmlist,OP_OR,OS_32,href,hregister);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ location_force_reg(exprasmlist,left.location,left.location.size,true);
|
|
|
+ location_release(exprasmlist,left.location);
|
|
|
+ cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ LOC_FLAGS :
|
|
|
+ begin
|
|
|
+ resflags:=left.location.resflags;
|
|
|
+ end;
|
|
|
+ LOC_REGISTER,LOC_CREGISTER :
|
|
|
+ begin
|
|
|
+ if left.location.size in [OS_64,OS_S64] then
|
|
|
+ begin
|
|
|
+ hregister:=cg.getintregister(exprasmlist,OS_32);
|
|
|
+ cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,left.location.registerlow,hregister);
|
|
|
+ cg.ungetregister(exprasmlist,hregister);
|
|
|
+ location_release(exprasmlist,left.location);
|
|
|
+ cg.a_op_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,hregister);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ location_release(exprasmlist,left.location);
|
|
|
+ cg.a_op_reg_reg(exprasmlist,OP_OR,left.location.size,left.location.register,left.location.register);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ LOC_JUMP :
|
|
|
+ begin
|
|
|
+ hregister:=cg.getintregister(exprasmlist,OS_INT);
|
|
|
+ objectlibrary.getlabel(hlabel);
|
|
|
+ cg.a_label(exprasmlist,truelabel);
|
|
|
+ cg.a_load_const_reg(exprasmlist,OS_INT,1,hregister);
|
|
|
+ cg.a_jmp_always(exprasmlist,hlabel);
|
|
|
+ cg.a_label(exprasmlist,falselabel);
|
|
|
+ cg.a_load_const_reg(exprasmlist,OS_INT,0,hregister);
|
|
|
+ cg.a_label(exprasmlist,hlabel);
|
|
|
+ cg.ungetregister(exprasmlist,hregister);
|
|
|
+ cg.a_op_reg_reg(exprasmlist,OP_OR,OS_INT,hregister,hregister);
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(200311301);
|
|
|
+ end;
|
|
|
+ { load flags to register }
|
|
|
+ location_reset(location,LOC_REGISTER,def_cgsize(resulttype.def));
|
|
|
+ location.register:=cg.getintregister(exprasmlist,location.size);
|
|
|
+ cg.g_flags2reg(exprasmlist,location.size,resflags,location.register);
|
|
|
+ truelabel:=oldtruelabel;
|
|
|
+ falselabel:=oldfalselabel;
|
|
|
end;
|
|
|
|
|
|
|
|
|
begin
|
|
|
- ctypeconvnode:=tarmtypeconvnode;
|
|
|
+ ctypeconvnode:=tarmtypeconvnode;
|
|
|
end.
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.6 2003-11-04 22:30:15 florian
|
|
|
+ Revision 1.7 2003-11-30 19:35:29 florian
|
|
|
+ * fixed several arm related problems
|
|
|
+
|
|
|
+ Revision 1.6 2003/11/04 22:30:15 florian
|
|
|
+ type cast variant<->enum
|
|
|
* cnv. node second pass uses now as well helper wrappers
|
|
|
|