|
@@ -198,34 +198,51 @@ unit cgcpu;
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure tcgarm.a_param_ref(list : taasmoutput;size : tcgsize;const r : treference;const paraloc : TCGPara);
|
|
|
+ procedure tcgarm.a_param_ref(list:Taasmoutput;size : tcgsize;const r : treference;const paraloc : TCGPara);
|
|
|
var
|
|
|
- ref: treference;
|
|
|
- tmpreg: tregister;
|
|
|
+ tmpref, ref: treference;
|
|
|
+ location: pcgparalocation;
|
|
|
+ sizeleft: aint;
|
|
|
begin
|
|
|
- paraloc.check_simple_location;
|
|
|
- case paraloc.location^.loc of
|
|
|
- LOC_REGISTER,LOC_CREGISTER:
|
|
|
- a_load_ref_reg(list,size,size,r,paraloc.location^.register);
|
|
|
- LOC_REFERENCE:
|
|
|
- begin
|
|
|
- reference_reset(ref);
|
|
|
- ref.base:=paraloc.location^.reference.index;
|
|
|
- ref.offset:=paraloc.location^.reference.offset;
|
|
|
- tmpreg := getintregister(list,size);
|
|
|
- a_load_ref_reg(list,size,size,r,tmpreg);
|
|
|
- a_load_reg_ref(list,size,size,tmpreg,ref);
|
|
|
- end;
|
|
|
- LOC_FPUREGISTER,LOC_CFPUREGISTER:
|
|
|
- case size of
|
|
|
- OS_F32, OS_F64:
|
|
|
- a_loadfpu_ref_reg(list,size,r,paraloc.location^.register);
|
|
|
- else
|
|
|
- internalerror(2002072801);
|
|
|
+ location := paraloc.location;
|
|
|
+ tmpref := r;
|
|
|
+ sizeleft := paraloc.intsize;
|
|
|
+ while assigned(location) do
|
|
|
+ begin
|
|
|
+ case location^.loc of
|
|
|
+ LOC_REGISTER,LOC_CREGISTER:
|
|
|
+ a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
|
|
|
+ LOC_REFERENCE:
|
|
|
+ begin
|
|
|
+ reference_reset_base(ref,location^.reference.index,location^.reference.offset);
|
|
|
+ { doubles in softemu mode have a strange order of registers and references }
|
|
|
+ if location^.size=OS_32 then
|
|
|
+ g_concatcopy(list,tmpref,ref,4)
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ g_concatcopy(list,tmpref,ref,sizeleft);
|
|
|
+ if assigned(location^.next) then
|
|
|
+ internalerror(2005010710);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ LOC_FPUREGISTER,LOC_CFPUREGISTER:
|
|
|
+ case location^.size of
|
|
|
+ OS_F32, OS_F64:
|
|
|
+ a_loadfpu_ref_reg(list,location^.size,tmpref,location^.register);
|
|
|
+ else
|
|
|
+ internalerror(2002072801);
|
|
|
+ end;
|
|
|
+ LOC_VOID:
|
|
|
+ begin
|
|
|
+ // nothing to do
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(2002081103);
|
|
|
end;
|
|
|
- else
|
|
|
- internalerror(2002081103);
|
|
|
- end;
|
|
|
+ inc(tmpref.offset,tcgsize2size[location^.size]);
|
|
|
+ dec(sizeleft,tcgsize2size[location^.size]);
|
|
|
+ location := location^.next;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
|