[PATCH] D101010: [SystemZ] [z/OS] Add XPLINK64 Calling Convention to SystemZ

Ulrich Weigand via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 18 08:35:14 PDT 2021


uweigand accepted this revision.
uweigand added a comment.
This revision is now accepted and ready to land.

So it looks like this is good to go now.   LGTM, thanks!



================
Comment at: llvm/lib/Target/SystemZ/SystemZCallingConv.td:235
+  // We need to deal with this first
+  CCIfType<[i64], CCCustom<"CC_SystemZ_I128Indirect">>,
+  // The first 3 integer arguments are passed in registers R1D-R3D.
----------------
Everybody0523 wrote:
> uweigand wrote:
> > Just to re-confirm: this handler will pass an i128 via implicit pointer (i.e. push the i128 to the stack somewhere outside the argument list, and pass a pointer to that location as argument).   Is that actually correct for XPLINK?  Reading the specs in the documentation referred to above, I get the impression that XPLINK never passes arguments via implicit pointers ...
> Yes, that's the intention. 
OK, thanks for confirming.


================
Comment at: llvm/lib/Target/SystemZ/SystemZCallingConv.td:286
+    CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
+             CCAssignToStack<16, 8>>>
+]>;
----------------
Everybody0523 wrote:
> uweigand wrote:
> > Note that the ELF calling convention makes special provisions for "short" vector types, i.e. those defined using attribute((vector_size(8))) or shorter.   They may be passed in VRs like the "normal" 16 byte vectors, but if none are available they'll **not** get passed in a normal 16-byte stack slot, but rather in an 8-byte stack slot.
> > 
> > I notice that this provision is not in place with the XPLINK convention.  Now I guess this is a decision for you to make, given that such types would be an extension to the ABI anyway.  I just wanted to make sure that this is **considered** choice and not just happening by accident.
> Hi Uli, we actually hadn't considered that - thank you for pointing this out. 
> 
> After thinking about it for a while I think we should keep the current behavior, ie. pass in a 16-byte stack slot. The reason for this is if were to copy the ELF behavior, and pass short vector types in a 8-byte stack slot if passed on the stack, we would have to do one of two things.
> 
> 
> # Have short vector types passed-by-register "shadow" 8 bytes in the argument area. However this would mean that vector registers can shadow a variable amount of space on the argument list depending of the type of the parameter contained within, which is very strange. 
> # Have short vector types passed-by-register "shadow" 16 bytes in the argument area, but those passed-by-stack occupy 8 bytes. This means that two params of the same type would occupy a different amount of memory in the argument list depending on whether it is passed-by-register or passed-by-stack - also very strange. 
I see, that does make sense to me as well.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101010/new/

https://reviews.llvm.org/D101010



More information about the llvm-commits mailing list