================

----------------
uweigand wrote:

There's still a direct contradiction in your latest statement:

>The requirement is that the upper 32 bits are zero. The XPLINK64 ABI spec 
>(z/OS Language Environment Vendor Interfaces) states that integer arguments 
>smaller than 64 bits are passed zero-extended into the full 64-bit GPR. So a 
>caller passing int -1 must put 0x00000000ffffffff in the register, not 
>0xffffffffffffffff.

contradicts:
>So the "what does the upper half need to contain" answer is: anything — the 
>callee fixes it regardless. The upper half content from the caller is 
>irrelevant to xlc callees.

Either the upper half is irrelevant or it has to be 0.  What is it?

>For -1, this produces 0xffffffffffffffff in the GPR. The xlc callee's prologue 
>LGFR R2,R2 then re-sign-extends 0xffffffffffffffff → still 0xffffffffffffffff, 
>which is wrong for what should be 0x00000000ffffffff (zero-extended -1).

If the caller passed 0x00000000ffffffff, it would still be the same 
0xffffffffffffffff after a LGFR R2,R2.

If the ABI does indeed say that all small integer arguments are passed 
zero-extended, then we can certainly implement that in a caller.  The question 
is then, can we also *rely* on that property when compiling a callee?  If so, 
we should simply emit `zeroext` markers from clang always ...

https://github.com/llvm/llvm-project/pull/206833
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to