LLVM asm with constraints, and 2 operands
kinke
noone at nowhere.com
Mon Jul 19 10:49:56 UTC 2021
On Monday, 19 July 2021 at 10:21:58 UTC, kinke wrote:
> What works reliably is a manual mov:
>
> ```
> int4 _mm_add_int4(int4 a, int4 b)
> {
> int4 r;
> asm { "paddd %1, %2; movdqa %2, %0" : "=x" (r) : "x" (a),
> "x" (b); }
> return r;
> }
> ```
This workaround is actually missing the clobber constraint for
`%2`, which might be problematic after inlining.
You can also specify the registers explicitly like so (here
exploiting ABI knowledge about `a` being passed in XMM1, and `b`
in XMM0 for extern(D)):
```
int4 _mm_add_int4(int4 a, int4 b)
{
asm { "paddd %1, %0" : "=xmm0" (b) : "xmm1" (a), "xmm0" (b); }
return b;
}
```
=>
```
paddd xmm0, xmm1
ret
```
But this might likely tamper with LLVM register allocation
optimizations after inlining...
More information about the Digitalmars-d-learn
mailing list