<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/132714>132714</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86-64 BMI2] Generating a bitstring with a `min(64, LEN)` 1 bits at the bottom should use `BZHI`
</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 Godbolt](https://zig.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:18,fontUsePx:'0',j:3,lang:zig,selection:(endColumn:27,endLineNumber:2,positionColumn:27,positionLineNumber:2,selectionStartColumn:27,selectionStartLineNumber:2,startColumn:27,startLineNumber:2),source:'export+fn+foo(len:+u64)+u64+%7B%0A++++return+~if+(len+%3E%3D+64)+@as(u64,+0)+else+~@as(u64,+0)+%3C%3C+@intCast(len)%3B%0A%7D%0A%0Aexport+fn+bar(len:+u64)+u64+%7B%0A++++const+m+%3D+~@as(u64,+0)%3B%0A++++const+x+%3D+bzhi_builtin(m,+len)%3B%0A++++return+if+(len+%3E%3D+64)+m+else+x%3B%0A%7D%0A%0Afn+bzhi_builtin(src:+u64,+mask:+u64)+u64+%7B%0A++++return+struct+%7B%0A++++++++extern+fn+@%22llvm.x86.bmi.bzhi.64%22(u64,+u64)+u64%3B%0A++++%7D.@%22llvm.x86.bmi.bzhi.64%22(src,+mask)%3B%0A%7D%0A'),l:'5',n:'0',o:'Zig+source+%233',t:'0')),header:(),k:62.7177700348432,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:ztrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:zig,libs:!(),options:'-O+ReleaseFast+-target+x86_64-linux+-mcpu%3Dznver5',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:3),l:'5',n:'0',o:'+zig+trunk+(Editor+%233)',t:'0')),header:(),k:37.2822299651568,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',m:100,n:'0',o:'',t:'0')),version:4)
```zig
export fn foo(len: u64) u64 {
return ~if (len >= 64)
@as(u64, 0)
else
~@as(u64, 0) << @intCast(len);
}
```
Gives me this emit:
```asm
mov rcx, -1
cmp rdi, 64
shlx rax, rcx, rdi
not rax
cmovae rax, rcx
```
Should be:
```asm
mov rcx, -1
bzhi rax, rcx, rdi
cmp rdi, 64
cmovae rax, rcx
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV82S2jgQfhpxUUHJ8i8HDtgM2VRlM1ub3RxyScl2Y5TIFiXJhJlDnn1Lkgk4mKnJ7lIug7r76z-kr22mNW86gBWKcxRvZqw3e6lWH5ngNVNfZ6Wsn1Z_7bnGlawBhWuM4vwTb_AbWZdSGBRvEM32xhw0CteIbhHdPvNm0Xj1QqrGCcPGqQNEM0Sz-4s9Ctc20kPNjVSIFtxpsx0X0LEW3CoNEE0RLXayMx8qJqw0yAbB3xr-OHkz4s2-oHAdIloI1tlYz7xBtNAgoDJcdt4_dHUhRd_apQNBV7_jHbzv2xKUFSJaHKTmFjK2PEtvzH-E-GCYMmPQWHcLnUBMGS6tQvaqGhoDp4NUBtF819mblIhmAnyNeZ9EDuF_5IjGqb2RtVsMlwLTKwv-zndO4vDOOnywtw2i-dkRigjTiGbOYYFoTrwchAbr4p7e-imGm3XCO1Mwbc7BllZ1Ti1ON-dfZD2ur2Tql-urZGcD5e2QxuaFPC9J3OJPV_jyec8_lz0XhneIZq33cVvKRJdf0eT20tDT3cb4fozz0Kq6aoxNqWX667_ZC9qovjJ37a4vOBlwGJcRigiiMaVCHNvFKUsWZcsXNs2FDRtTet30cU5TbXNFL17j1NZ-Kfnejkr9CRL-8MSeLroReUi_-mRJIx-OmkuEhqG3MNf2S-9xD6x2Z9SxmpXYvid0kQZpmhISRlkU0kvoyLtqLZERci8Jv7BESybiFtNc2h64gCsm_SEJ189G9d1Xy5tcGFCewbNyFLrkHVNPI9r1osfyC1RmpKhk20JnHjvxNPJRQ9k3BRNCj8xraFnXCBjbcmWJ8Qh6JIYTVL0Z0z_vDIiRleClYuqp8KPqIjeKtyPoEVQpNWx8Brxrfu7lTrBGf-Tw7fEw0Mvk0IleHDr056EjeKmv_iEbSB7sFBiKnT8imv8JApiGrSPEfG6YasAxTpZ8TqK54F1vyWfeVofeccVzdwQ1bF55BKV4DT-HeWHcBRPTLpiadsG9YRfcH3a3qlvkLWDKbjTqwlcfXERz1_t82OuWbM8PFz-O8fJXT3KYLmhGKV0ukziIk-z_PclXpdFfcDfl5ghK-3_dcStZ2ysh_rKNOc9UvOvw9fMC9mxsvzBKc0TWGGPsJwL-znfYW2IUPqBwg5PBPR4-44mKyaB1c-xi9X3CDKOwQGGBpx4LQpsHSjfXRfia3ljGwC1gY59VoeWuGeNymW6vYrfy6L5VdbKh58GVrmoPXldzq0siq9N7cXJC5gADzppcgJ00-Gxz7U4eGYyQNwV82Mte1LiE_5K3HYIv5jdZ2KuynNWrsF6GSzaDVZBGNAuiKAhm-1VJsiXJol1A4iCrgERJlEVxvasCUgJkyYyvKKExCWkUBCQJ6YKGdVoGS0KCXcTqLEARgZZxsXADXapmxrXuYRWENA2imWAlCO1eUCjt4Bt2WkSpfV9RKwual32jUUQE10Zf3BhuhHuzOWXJPIlw_vtbC8JvoAPFDO8azHDJjTbK_v7GzR4zjBLSuucnvyffPby3Wy8hOHC2mBls9oBLaYxssfb_W6_BAvNPv721zeqVWI1fihpu9n25qGSL6NZmOHzND0q6QUq3ri6N6HYo_Lii_wQAAP__0iCyEA">