From a286ad9d774c19718bea0cbfc84347dc67dd4862 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 11 Jan 2021 21:47:32 +0000 Subject: [PATCH] * do not extend 8 bit return values to 32 bit when loading them into eax, this is not required by the api, neither does e.g. clang it git-svn-id: trunk@48136 - --- compiler/x86_64/cpupara.pas | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index 7bbb48580c..b35b0a2331 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -178,10 +178,13 @@ unit cpupara; 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 } + as per the x86-64 ABI -> do the same + + some testing showed, that this is not true for 8 bit values: + in case of an 8 bit value, it is not zero/sign extended } if not assigned(cl.def) or - not is_pasbool(cl.def) or - (torddef(cl.def).ordtype<>pasbool1) then + not(cl.def.typ=orddef) or + not(torddef(cl.def).ordtype in [uchar,u8bit,s8bit,pasbool1]) then cl.def:=u32inttype; end else