<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/112425>112425</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [x86-64 BMI1] Allow `andn` to be emitted from `NOT` + <some bit/byte reordering> + `AND`
        </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>
    Zen 5 Assembly:

```diff
.LCPI0_0:
 .byte   1
        .byte   2
        .byte   4
        .byte 8
        .byte   16
        .byte   32
        .byte   64
 .byte   128
foo:
        vpbroadcastq    xmm1, qword ptr [rip + .LCPI0_0]
        mov     rax, rdi
        bswap   rax
        bswap rsi
        vmovq   xmm0, rax
        vmovq   xmm2, rsi
 vgf2p8affineqb  xmm0, xmm0, xmm1, 0
        vgf2p8affineqb  xmm2, xmm2, xmm1, 0
        vpsubq  xmm0, xmm0, xmm2
        vgf2p8affineqb  xmm0, xmm0, xmm1, 0
        vmovq   rax, xmm0
-       not     rax
 bswap   rax
-       and     rax, rdi
+       andn    rax, rax, rdi
 ret
```

Zig version: ([Godbolt](https://zig.godbolt.org/z/bGzofYos9))
LLVM version (optimized): ([Godbolt](https://llvm.godbolt.org/z/cjv7oMf5Y))

```llvm
define dso_local i64 @foo(i64 %0, i64 %1) local_unnamed_addr {
Entry:
  %2 = tail call i64 @llvm.bswap.i64(i64 %0)
  %3 = bitcast i64 %2 to <8 x i8>
  %4 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %3)
  %5 = bitcast <8 x i8> %4 to i64
  %6 = tail call i64 @llvm.bswap.i64(i64 %1)
  %7 = bitcast i64 %6 to <8 x i8>
  %8 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %7)
  %9 = bitcast <8 x i8> %8 to i64
 %10 = tail call <2 x i64> asm "vpsubq ${2}, ${1}, ${0}", "=v,v,v,~{dirflag},~{fpsr},~{flags}"(i64 %5, i64 %9) #2
  %11 = extractelement <2 x i64> %10, i64 0
  %12 = bitcast i64 %11 to <8 x i8>
  %13 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %12)
 %14 = bitcast <8 x i8> %13 to i64
  %15 = xor i64 %14, -1
  %16 = tail call i64 @llvm.bswap.i64(i64 %15)
  %17 = and i64 %16, %0
  ret i64 %17
}

declare i64 @llvm.bswap.i64(i64) #1

declare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) #1

define dso_local i64 @bar(i64 %0, i64 %1) local_unnamed_addr {
Entry:
  %2 = tail call i64 @llvm.bswap.i64(i64 %0)
  %3 = bitcast i64 %2 to <8 x i8>
  %4 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %3)
  %5 = bitcast <8 x i8> %4 to i64
  %6 = tail call i64 @llvm.bswap.i64(i64 %1)
  %7 = bitcast i64 %6 to <8 x i8>
  %8 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %7)
  %9 = bitcast <8 x i8> %8 to i64
  %10 = tail call <2 x i64> asm "vpsubq ${2}, ${1}, ${0}", "=v,v,v,~{dirflag},~{fpsr},~{flags}"(i64 %5, i64 %9) #2
  %11 = extractelement <2 x i64> %10, i64 0
  %12 = bitcast i64 %11 to <8 x i8>
  %13 = tail call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %12)
  %14 = bitcast <8 x i8> %13 to i64
  %15 = tail call i64 @llvm.bswap.i64(i64 %14)
  %16 = tail call i64 asm "andn ${1}, ${2}, ${0}", "=r,r,r,~{dirflag},~{fpsr},~{flags}"(i64 %0, i64 %15) #2
  ret i64 %16
}
```

Problem occurs in `foo` even when you manually change the last 3 statements to:

```llvm
 %15 = tail call i64 @llvm.bswap.i64(i64 %14)
  %16 = xor i64 %15, -1
 %17 = and i64 %16, %0
```

The code contains my workaround for https://github.com/llvm/llvm-project/issues/111046


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuP2jwX_jVmczQoPrmyYDEMnapS26-LqlK7GTmJE9wmMWMbBrr4fvsrOwGSTMo7vSzeRREQbJ_bc57jEwemtSgbzpckXJFwPWM7s5Fq-YlVImfq2yyV-XH5hTcQwq3WvE6rI_Fvibcm3uk78tp3LoqinZq_vfvwxnvwzpIwT4-GAwDtxt3rNI3T08HUdDItS6Ppef8HtqNgHBp2lgspL4F3r_02VZLlGdPm0Y4PdU0J3sHjk1Q5bI0CEq6U2ALBFZzhh-uhlVru3VWxg1VWuRiup_qJbbv1iQWlR_L7Wu4f22g8Z3Cs1xNAJ3C2sC8L3CasKETDH9OLid7VAfRGBp-rYSeO19S2epc-TnrBf3Xworg6oF1mnbQTuOkEGmnOqW81nyX7JMqafJIlS-1ZoulLjOlU3Iz2Rn_DfBEl7LnSQjbEvwWCCQlXr2WeysrYksFkY8xW2xrEe4L330U5L9vluVSlnSF4n77-LovPUi8Iurcz_fbtp3cn29aw3BpRi-88txIv8VVV-3rCWfZ1H8t3Rfi572wE0aq2Uzm37EGu5UMlM1aBiAIggWc3FiZugKFjs_tNCS7AiT7smobVPH9gea6AxKvW4qvGqGNvUxIMEYi_BsNEBRmrzj4cAEftXETBwN2ip-077VQYu6NPYSAYCcS_S-AAIiH-q55CMHLXF7v4FUZxm34-3ycisdkeiGHoD8MIB2GMhQMbjzg3KjsV_RxqOnQXT6GOrqBO_gzqeBjG4irqZIjaovCeh4FWJQqsDtM1EMSuxxAMSLxCEq9tgbUjOhh5boTtBBJ_vSd4d_r8n8SrXKiiYmWrZCeKrVa9UcVKfbJxynTYK2e7RYDg5c5jMVCHgR-MYpnhFa95Y0ZAHNSTHa-vjFPEUXqFOer_GeooXrizw-Aqd9R_XrK0LfKDVOfAAwvyhvaFfraww2FJ0ba0bes-SUQtweE5kYpfUhd3zSte93tZzrOKKX7NeUctnVL7hRRPm5tunylTf9vn3_b5c-3zb__87_TP32ugL6_aYORyquo70t1JdopkvE65Inh3-vwq5YMWFo4573fraNytp47VH5RMK16DzLKd0iAaIJE7ckYe8D1v4GnDGzjKHdSs2bGqOkK2YU3JwWw4VJYNH7RhxpWWBiN_9KB7Oen-QXr698dwcH980e1tMiUfNxwymduvxjDRaKiP8CTVN6bkrsmhkAqG5_9SmM0unWey7h4GusvNVsmvPDME74XWO64J3lNKvSDq-5vlSz9f-As240sa48JD9BBnm2VcsCKO8wWLEhYuChbQrEhjngV-wn0_ymZiiR4G1KMhXYR-gPPcz_wizXyPFVnixT4JPF4zUc1dWqUqZy6OJaUYYDirWMor7f7EQGz4E7hVW27heqaWDkK6K7XlRWijL2aMMJX79-OQRDdRAKt3bygJ13BbVfLJlpDdIraGjISUA6-FMTyHQsnarr7_30e7aJ8NiX-nZc3t3rbPZ0fDQXGpcq5EU7b7e2VVbt-vSeTNdqpa_k7yHe79Ev8JAAD__yeEsYE">