|
@@ -223,15 +223,21 @@ begin
|
|
p.funcretloc[side].loc := LOC_VOID;
|
|
p.funcretloc[side].loc := LOC_VOID;
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
-
|
|
|
|
|
|
+ { Return is passed as var parameter }
|
|
|
|
+ if ret_in_param(p.returndef, p.proccalloption) then
|
|
|
|
+ begin
|
|
|
|
+ p.funcretloc[side].loc := LOC_REFERENCE;
|
|
|
|
+ p.funcretloc[side].size := retcgsize;
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
{ Return in FPU register? }
|
|
{ Return in FPU register? }
|
|
if p.returndef.typ = floatdef then begin
|
|
if p.returndef.typ = floatdef then begin
|
|
p.funcretloc[side].loc := LOC_FPUREGISTER;
|
|
p.funcretloc[side].loc := LOC_FPUREGISTER;
|
|
p.funcretloc[side].register := NR_FPU_RESULT_REG;
|
|
p.funcretloc[side].register := NR_FPU_RESULT_REG;
|
|
p.funcretloc[side].size := retcgsize;
|
|
p.funcretloc[side].size := retcgsize;
|
|
end else
|
|
end else
|
|
- { Return in register? }
|
|
|
|
- if not ret_in_param(p.returndef, p.proccalloption) then begin
|
|
|
|
|
|
+ { Return in register }
|
|
|
|
+ begin
|
|
p.funcretloc[side].loc := LOC_REGISTER;
|
|
p.funcretloc[side].loc := LOC_REGISTER;
|
|
p.funcretloc[side].size := retcgsize;
|
|
p.funcretloc[side].size := retcgsize;
|
|
if side = callerside then
|
|
if side = callerside then
|
|
@@ -240,9 +246,6 @@ begin
|
|
else
|
|
else
|
|
p.funcretloc[side].register := newreg(R_INTREGISTER,
|
|
p.funcretloc[side].register := newreg(R_INTREGISTER,
|
|
RS_FUNCTION_RETURN_REG, cgsize2subreg(retcgsize));
|
|
RS_FUNCTION_RETURN_REG, cgsize2subreg(retcgsize));
|
|
- end else begin
|
|
|
|
- p.funcretloc[side].loc := LOC_REFERENCE;
|
|
|
|
- p.funcretloc[side].size := retcgsize;
|
|
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|