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

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] Add some orc.b optimizations
        </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>
    [Godbolt link](https://godbolt.org/z/oh87najaG)

The following functions can all use, or should be directly translated to, the orc.b instruction:

```zig
// If the lowest bit of each byte is 1, set that byte to 255, else 0.
// Should emit constant-load+and+orc.b
export fn orc_b_opportunity1(x: u64) u64 {
    return (x & 0x0101010101010101) *% 0xFF;
}

// If the lowest bit of each byte is 1, set that byte to 255, else 0.
// Should emit constant-load+and+orc.b
export fn orc_b_opportunity1_fixed(x: u64) u64 {
    return orc_b(x & 0x0101010101010101);
}

// If the highest bit of each byte is 1, set that byte to 255, else 0.
// Should emit constant-load+and+orc.b
export fn orc_b_opportunity2(x: u64) u64 {
    return ((x & 0x8080808080808080) >> 7) *% 0xFF;
}

// If the highest bit of each byte is 1, set that byte to 255, else 0.
// Should emit constant-load+and+orc.b
export fn orc_b_opportunity3(x: u64) u64 {
    const y = x & 0x8080808080808080;
 return (y << 1) -% (y >> 7);
}

// If the highest bit of each byte is 1, set that byte to 255, else 0.
// Should emit constant-load+and+orc.b
export fn orc_b_opportunity4(x: u64) u64 {
 return ((x >> 7) & 0x0101010101010101) *% 0xFF;
}

// If the highest bit of each byte is 1, set that byte to 255, else 0.
export fn orc_b_opportunity2_and_3_and_4_fixed(x: u64) u64 {
    return orc_b(x & 0x8080808080808080);
}

// If any byte is non-zero, set that byte to 255 (all ones), else 0.
// This should just emit the `orc.b` instruction.
export fn orc_b_opportunity5(x: u64) u64 {
    const c1: u64 = @bitCast([_]u8{0x7F} ** 8);
    return orc_b_opportunity2(((x & c1) +% c1) | x);
}

// If any byte is non-zero, set that byte to 255 (all ones), else 0.
// This should just emit the `orc.b` instruction.
export fn orc_b_opportunity6(x: u64) u64 {
    const c1: u64 = @bitCast([_]u8{0x7F} ** 8);
    return orc_b_opportunity3(((x & c1) +% c1) | x);
}

// If any byte is non-zero, set that byte to 255 (all ones), else 0.
// This should just emit the `orc.b` instruction.
export fn orc_b_opportunity7(x: u64) u64 {
    const c1: u64 = @bitCast([_]u8{0x7F} ** 8);
    return orc_b_opportunity4(((x & c1) +% c1) | x);
}

export fn orc_b_opportunity5_and_6_and_7_fixed(x: u64) u64 {
    return orc_b(x);
}

fn orc_b(x: u64) u64 {
 return struct {
        extern fn @"llvm.riscv.orc.b.i64"(u64) u64;
 }.@"llvm.riscv.orc.b.i64"(x);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkl0-P2joQwD_N5DIiMs7_Qw5AmqrX16pX5CSGeGtsFDu7sJ_-yQ7bhdVbWLU98N4jyFFsz3j888xYw4wRW8V5CckSkipgo-31UH5nUnRs-BE0uju6sc-6a7S0KIX6AUkFNO-t3RuIFkBroPV2Gg_1sAVaPwOtdZ9nij2wz0ALIBWQxdR-6zlutJT6SagtbkbVWqGVwZYpZFLiaDjQFeoBTa9H2WHDsRMDb608oh2YMpJZ3qHVbprtOeqhDRsUythh9MqcVWcrQkqm_7PYnnq8zfhl4-WlfuLGYiMs6g1y1vbYHC1HYXDu1jDcou2ZnXqtRpokrp9Lw5GEFyq_TjbznbDYamUsU3YmNeuALplyrbd2kuGHvR4sbpTbwrpZ6737HpWwxznQ_ADRAsc0Blq4F0K2nOQQEQdux0Ghm4ZAUyQHMr98nBjQBdAEyaGuITpJQ1Zd0Ll_FuuNOPDug0S8-HUsH0PRi21_dyzox_3ijEFOLh_vGtEniD5h9ktucpdsoltsvHI8IkQVvovmZf9nJJ3ECqIV-piaOVSn3p8I_8XY4qvY3vrThdf8sbTzZ8Bci5s1U9068m38W_nkH2Lp9h6ZOv7cj9Jq9swH_d62HGt3EWrFjVP-zvF_64V5uSIfRmMnR3AwISXTyafk_Fa8DSn5WAC189McH0gQk0bYFTPW-UiyXENSjTlkS3LIasiqyRkWmJ-Desv3bYo7T1_tyaWWzqVOH9kKD_8h8OldgI_-f-CzuwAf_z74a1Htk17q2-zXUt-VhTfn025cItPBXC7lfvxg-aCc8RAToFTKx104CNM-hv5YQ-GUurzwqv0VLGRVeEvunR28FAZBV0ZdERUs4OU8mxe0iPI8DfqSdBnnlEdt1m1altGIsaQriixN53PeJlkgSkpoTFKakCTKSRo2UZPnBSFtnHeEFi3EhO-YkKE3Tg_bQBgz8rJIkyIJJGu4NL74olTxJ_SDzuakCobSycyacWsgJlIYa161WGGlr9r--vJ1NfsOSYWLrkOjdy8Fkd5bsRPPzJdXwTjI8k3JJmw_NmGrd0Brp_f0mu0H_cBbC7T21hig9WTtY0n_DgAA__8Myhd-">