<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
There are several ways to pass structures in and out of functions, and the fastest will presumably usually be in<span style="color: rgb(0, 0, 0); font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;"> registers.</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Return:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
System V lets us use 2 64-bit registers for structure returns, where figuring this out seems to be the frontend's problem; If the packed struct is <= 128 bits, pass it by value as a llvm aggregate (and use extractvalue and insertvalue to manipulate it) otherwise
 write to a pointer with "sret" attribute and return void. It seems that once I commit to the sret style, llvm can no longer return the struct in registers, but I am also suspicious of always returning structs by value, and even <span style="margin:0px;font-size:12pt">recall
 reading somewhere that llvm is not good at handling large aggregates (maybe that applies mainly to loads and stores).</span><br>
<span style="margin:0px;font-size:12pt"></span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Struct arguments:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Here too we have a choice between passing a llvm aggregate or passing down a pointer argument with "byval" attribute. As before it is unclear which should be preferred.<span style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);"><br>
</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
I'm also curious about how best to represent bitvectors, and have noticed clang sometimes casting structures to arrays; I currently use raw arrays of %i1 and extract|insert value.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
My final concern is that the convention needs to be predictable, both for ABI compatibility reasons and to inform appropriate Bitcasting of function pointers. I would also like to understand what exactly informs the threshold for switching strategy.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks for any insights,<br>
James</div>
</body>
</html>