|
2 | 2 | ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
|
3 | 3 | ; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I
|
4 | 4 | ; RUN: llc -mtriple=riscv32 -mattr=+zbs -verify-machineinstrs < %s \
|
5 |
| -; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBS |
| 5 | +; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBS,RV32ZBSNOZBB |
| 6 | +; RUN: llc -mtriple=riscv32 -mattr=+zbs,+zbb -verify-machineinstrs < %s \ |
| 7 | +; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBS,RV32ZBSZBB |
6 | 8 |
|
7 | 9 | define i32 @bclr_i32(i32 %a, i32 %b) nounwind {
|
8 | 10 | ; RV32I-LABEL: bclr_i32:
|
@@ -62,22 +64,37 @@ define i64 @bclr_i64(i64 %a, i64 %b) nounwind {
|
62 | 64 | ; RV32I-NEXT: and a1, a2, a1
|
63 | 65 | ; RV32I-NEXT: ret
|
64 | 66 | ;
|
65 |
| -; RV32ZBS-LABEL: bclr_i64: |
66 |
| -; RV32ZBS: # %bb.0: |
67 |
| -; RV32ZBS-NEXT: andi a3, a2, 63 |
68 |
| -; RV32ZBS-NEXT: addi a4, a3, -32 |
69 |
| -; RV32ZBS-NEXT: slti a4, a4, 0 |
70 |
| -; RV32ZBS-NEXT: neg a5, a4 |
71 |
| -; RV32ZBS-NEXT: bset a2, zero, a2 |
72 |
| -; RV32ZBS-NEXT: and a2, a5, a2 |
73 |
| -; RV32ZBS-NEXT: bset a3, zero, a3 |
74 |
| -; RV32ZBS-NEXT: addi a4, a4, -1 |
75 |
| -; RV32ZBS-NEXT: and a3, a4, a3 |
76 |
| -; RV32ZBS-NEXT: not a3, a3 |
77 |
| -; RV32ZBS-NEXT: not a2, a2 |
78 |
| -; RV32ZBS-NEXT: and a0, a2, a0 |
79 |
| -; RV32ZBS-NEXT: and a1, a3, a1 |
80 |
| -; RV32ZBS-NEXT: ret |
| 67 | +; RV32ZBSNOZBB-LABEL: bclr_i64: |
| 68 | +; RV32ZBSNOZBB: # %bb.0: |
| 69 | +; RV32ZBSNOZBB-NEXT: andi a3, a2, 63 |
| 70 | +; RV32ZBSNOZBB-NEXT: addi a4, a3, -32 |
| 71 | +; RV32ZBSNOZBB-NEXT: slti a4, a4, 0 |
| 72 | +; RV32ZBSNOZBB-NEXT: neg a5, a4 |
| 73 | +; RV32ZBSNOZBB-NEXT: bset a2, zero, a2 |
| 74 | +; RV32ZBSNOZBB-NEXT: and a2, a5, a2 |
| 75 | +; RV32ZBSNOZBB-NEXT: bset a3, zero, a3 |
| 76 | +; RV32ZBSNOZBB-NEXT: addi a4, a4, -1 |
| 77 | +; RV32ZBSNOZBB-NEXT: and a3, a4, a3 |
| 78 | +; RV32ZBSNOZBB-NEXT: not a3, a3 |
| 79 | +; RV32ZBSNOZBB-NEXT: not a2, a2 |
| 80 | +; RV32ZBSNOZBB-NEXT: and a0, a2, a0 |
| 81 | +; RV32ZBSNOZBB-NEXT: and a1, a3, a1 |
| 82 | +; RV32ZBSNOZBB-NEXT: ret |
| 83 | +; |
| 84 | +; RV32ZBSZBB-LABEL: bclr_i64: |
| 85 | +; RV32ZBSZBB: # %bb.0: |
| 86 | +; RV32ZBSZBB-NEXT: andi a3, a2, 63 |
| 87 | +; RV32ZBSZBB-NEXT: bset a4, zero, a3 |
| 88 | +; RV32ZBSZBB-NEXT: addi a3, a3, -32 |
| 89 | +; RV32ZBSZBB-NEXT: slti a3, a3, 0 |
| 90 | +; RV32ZBSZBB-NEXT: addi a5, a3, -1 |
| 91 | +; RV32ZBSZBB-NEXT: and a4, a5, a4 |
| 92 | +; RV32ZBSZBB-NEXT: neg a3, a3 |
| 93 | +; RV32ZBSZBB-NEXT: bset a2, zero, a2 |
| 94 | +; RV32ZBSZBB-NEXT: and a2, a3, a2 |
| 95 | +; RV32ZBSZBB-NEXT: andn a0, a0, a2 |
| 96 | +; RV32ZBSZBB-NEXT: andn a1, a1, a4 |
| 97 | +; RV32ZBSZBB-NEXT: ret |
81 | 98 | %and = and i64 %b, 63
|
82 | 99 | %shl = shl nuw i64 1, %and
|
83 | 100 | %neg = xor i64 %shl, -1
|
|
0 commit comments