<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/89996>89996</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Bitmanipulations can be performed on vectors after they are moved over to scalar registers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Validark
</td>
</tr>
</table>
<pre>
This code:
```zig
export fn foo(v: @Vector(4, u8)) u32 {
return @bitCast(v & @as(@Vector(4, u8), @splat(0xF)));
}
```
Gives me:
```asm
.LCPI0_0:
.byte 15
.byte 15
.byte 15
.byte 15
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
.zero 1
foo:
vpand xmm0, xmm0, xmmword ptr [rip + .LCPI0_0]
vmovd eax, xmm0
ret
```
However, I can move the `&` to come after moving to a scalar register:
```zig
export fn bar(v: @Vector(4, u8)) u32 {
return @as(u32, @bitCast(v)) & 0x0F0F0F0F;
}
```
Emit:
```asm
bar:
vmovd eax, xmm0
and eax, 252645135
ret
```
https://zig.godbolt.org/z/jq1dfvboE
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VE1v2zgQ_TXUZRCDIvVhHXSI7Wg3wB72UORakOJYZiqJKkkpTn59Qcl10gRJkxSlCRN4mnmcr0fhnG56xJKkG5LuIjH6g7HljWi1EvZbJI26L78ctIPaKCT8ktAdoT__M7rsB90sCB4HYz3se9gbQ9h6IvwSSEJvsPbGErZOCNvCuCasIKyAkTMg-WbxBQCw6EfbBw-p_VY4HziAsCxAwhG2fo1sGyzc0IrgQo_VckPY_MRP8t2zsJ_m8o-e0EH3aorCdQuy-m_7_zX9Ss-GsJL3HgEgTh8TCetz-Av0Aa0J1p-C_8z775O-bRuG6Fzm05oG0SsAOHYdDW1_ct4Zq2DwFki6sXoAwjZwble6e8bTmSnwoDieaRYDi_6NQfnX3OGENvhcQy166MyE4A8IwZBlJKPgDdSmQxB7jzYY6L4JoABXi1ZYsNho59F-QFBS2I8K6lFNs3RGzk46eSKuk2OQGD3Savm9UzNXnfa_1UuI-0UP59q_rPxpLQ0-t4alLEvSmKfv6s_B-8GFG1lFWPWgm1VjlDStXxnbBISw6vZ7rPaTNFeRKrkqeCEiLOM85kWRZHEeHcp6j5wmucw40pylqJKUZxmn61gUUnEZ6ZJRltCEJSzmWZqv8kwyVUguaU5pnhYkodgJ3a7adurC3ZF2bsRyXRRFFrVCYuvmV5exHu9g_kgYC4-wLYPPhRwbRxLaaufdI4vXvsVyo30nej2MrfDa9G6eRIkwoN0b26EC08M0D4k7jaE_4D0Ii_PAKjBTwMzziXTRaNvy1yI22h9GuapNR1gVAjkdF4M1t1h7wqo5fEdYNaf3IwAA__9jDrIO">