From 68fa17593dd43eb281efd012f68722989abbba2c Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Thu, 6 Mar 2014 21:41:00 +0000 Subject: [PATCH] * no longer associated defs with size 1 to 3 bytes with paralocs, because gcc and clang always allocate them in multiple of 4 bytes too (except in case of _Bool, which is 1 byte -> do the same for PasBool) and this is one possible interpretation of the ABI. This also frees us from having to perform special adjustments afterwards to ensure that smaller values are sign/zero-extended to 32 bits git-svn-id: branches/hlcgllvm@26993 - --- compiler/x86_64/cpupara.pas | 41 ++++++++----------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index 5b28b4989b..ba8b38c888 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -171,15 +171,13 @@ unit cpupara; if size<=4 then begin cl.typ:=X86_64_INTEGERSI_CLASS; + { gcc/clang sign/zero-extend all values to 32 bits, except for + _Bool (= Pascal boolean), which is only zero-extended to 8 bits + as per the x86-64 ABI -> do the same } if not assigned(cl.def) or - (cl.def.size1) then + cl.def:=u32inttype; end else begin @@ -907,17 +905,6 @@ unit cpupara; if set_common_funcretloc_info(p,forcetempdef,retcgsize,result) then exit; - { integer sizes < 32 bit have to be sign/zero extended to 32 bit on - the callee side (caller can expect those bits are valid) } - if (side=calleeside) and - (retcgsize in [OS_8,OS_S8,OS_16,OS_S16]) then - begin - retcgsize:=OS_S32; - result.def:=s32inttype; - result.intsize:=4; - result.size:=retcgsize; - end; - { Return in FPU register? -> don't use classify_argument(), because currency and comp need special treatment here (they are integer class when passing as parameter, but LOC_FPUREGISTER as function result) } @@ -984,8 +971,7 @@ unit cpupara; end else if result.intsize in [1,2,4] then begin - paraloc^.size:=retcgsize; - paraloc^.def:=result.def; + paraloc^.size:=def_cgsize(paraloc^.def); end else begin @@ -1078,16 +1064,6 @@ unit cpupara; getvalueparaloc(hp.varspez,paradef,loc[1],loc[2]); paralen:=push_size(hp.varspez,paradef,p.proccalloption); paracgsize:=def_cgsize(paradef); - { integer sizes < 32 bit have to be sign/zero extended to 32 bit - on the caller side } - if (side=callerside) and - (paracgsize in [OS_8,OS_S8,OS_16,OS_S16]) then - begin - paracgsize:=OS_S32; - paralen:=4; - paradef:=s32inttype; - loc[1].def:=paradef; - end; end; { cheat for now, we should copy the value to an mm reg as well (FK) } @@ -1179,8 +1155,7 @@ unit cpupara; end else begin - paraloc^.size:=paracgsize; - paraloc^.def:=paradef; + paraloc^.size:=def_cgsize(paraloc^.def); { s64comp is pushed in an int register } if paraloc^.size=OS_C64 then begin