1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2
- ; RUN: llc -mtriple=riscv32 < %s | FileCheck %s -check-prefix=RV32
3
- ; RUN: llc -mtriple=riscv64 < %s | FileCheck %s -check-prefix=RV64
2
+ ; RUN: llc -mtriple=riscv32 -mattr=+v < %s | FileCheck %s -check-prefix=RV32
3
+ ; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s -check-prefix=RV64
4
4
5
5
; FIXED WIDTH
6
6
7
7
define i16 @ctz_v4i32 (<4 x i32 > %a ) {
8
8
; RV32-LABEL: ctz_v4i32:
9
9
; RV32: # %bb.0:
10
- ; RV32-NEXT: lw a3, 0(a0)
11
- ; RV32-NEXT: lw a1, 4(a0)
12
- ; RV32-NEXT: lw a2, 12(a0)
13
- ; RV32-NEXT: lw a4, 8(a0)
14
- ; RV32-NEXT: seqz a0, a3
15
- ; RV32-NEXT: addi a0, a0, -1
16
- ; RV32-NEXT: andi a0, a0, 4
17
- ; RV32-NEXT: seqz a3, a4
18
- ; RV32-NEXT: addi a3, a3, -1
19
- ; RV32-NEXT: andi a3, a3, 2
20
- ; RV32-NEXT: bltu a3, a0, .LBB0_2
21
- ; RV32-NEXT: # %bb.1:
22
- ; RV32-NEXT: mv a0, a3
23
- ; RV32-NEXT: .LBB0_2:
24
- ; RV32-NEXT: snez a2, a2
25
- ; RV32-NEXT: seqz a1, a1
26
- ; RV32-NEXT: addi a1, a1, -1
27
- ; RV32-NEXT: andi a1, a1, 3
28
- ; RV32-NEXT: bltu a2, a1, .LBB0_4
29
- ; RV32-NEXT: # %bb.3:
30
- ; RV32-NEXT: mv a1, a2
31
- ; RV32-NEXT: .LBB0_4:
32
- ; RV32-NEXT: bltu a1, a0, .LBB0_6
33
- ; RV32-NEXT: # %bb.5:
34
- ; RV32-NEXT: mv a0, a1
35
- ; RV32-NEXT: .LBB0_6:
10
+ ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
11
+ ; RV32-NEXT: vmsne.vi v0, v8, 0
12
+ ; RV32-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
13
+ ; RV32-NEXT: vmv.v.i v8, 0
14
+ ; RV32-NEXT: vmerge.vim v8, v8, -1, v0
15
+ ; RV32-NEXT: vid.v v9
16
+ ; RV32-NEXT: vrsub.vi v9, v9, 4
17
+ ; RV32-NEXT: vand.vv v8, v8, v9
18
+ ; RV32-NEXT: vredmaxu.vs v8, v8, v8
19
+ ; RV32-NEXT: vmv.x.s a0, v8
36
20
; RV32-NEXT: li a1, 4
37
21
; RV32-NEXT: sub a1, a1, a0
38
22
; RV32-NEXT: andi a0, a1, 255
39
23
; RV32-NEXT: ret
40
24
;
41
25
; RV64-LABEL: ctz_v4i32:
42
26
; RV64: # %bb.0:
43
- ; RV64-NEXT: lw a3, 0(a0)
44
- ; RV64-NEXT: lw a1, 8(a0)
45
- ; RV64-NEXT: lw a2, 24(a0)
46
- ; RV64-NEXT: lw a4, 16(a0)
47
- ; RV64-NEXT: seqz a0, a3
48
- ; RV64-NEXT: addi a0, a0, -1
49
- ; RV64-NEXT: andi a0, a0, 4
50
- ; RV64-NEXT: seqz a3, a4
51
- ; RV64-NEXT: addi a3, a3, -1
52
- ; RV64-NEXT: andi a3, a3, 2
53
- ; RV64-NEXT: bltu a3, a0, .LBB0_2
54
- ; RV64-NEXT: # %bb.1:
55
- ; RV64-NEXT: mv a0, a3
56
- ; RV64-NEXT: .LBB0_2:
57
- ; RV64-NEXT: snez a2, a2
58
- ; RV64-NEXT: seqz a1, a1
59
- ; RV64-NEXT: addi a1, a1, -1
60
- ; RV64-NEXT: andi a1, a1, 3
61
- ; RV64-NEXT: bltu a2, a1, .LBB0_4
62
- ; RV64-NEXT: # %bb.3:
63
- ; RV64-NEXT: mv a1, a2
64
- ; RV64-NEXT: .LBB0_4:
65
- ; RV64-NEXT: bltu a1, a0, .LBB0_6
66
- ; RV64-NEXT: # %bb.5:
67
- ; RV64-NEXT: mv a0, a1
68
- ; RV64-NEXT: .LBB0_6:
27
+ ; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
28
+ ; RV64-NEXT: vmsne.vi v0, v8, 0
29
+ ; RV64-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
30
+ ; RV64-NEXT: vmv.v.i v8, 0
31
+ ; RV64-NEXT: vmerge.vim v8, v8, -1, v0
32
+ ; RV64-NEXT: vid.v v9
33
+ ; RV64-NEXT: vrsub.vi v9, v9, 4
34
+ ; RV64-NEXT: vand.vv v8, v8, v9
35
+ ; RV64-NEXT: vredmaxu.vs v8, v8, v8
36
+ ; RV64-NEXT: vmv.x.s a0, v8
69
37
; RV64-NEXT: li a1, 4
70
38
; RV64-NEXT: subw a1, a1, a0
71
39
; RV64-NEXT: andi a0, a1, 255
@@ -79,29 +47,29 @@ define i16 @ctz_v4i32(<4 x i32> %a) {
79
47
define i32 @ctz_v2i1_poison (<2 x i1 > %a ) {
80
48
; RV32-LABEL: ctz_v2i1_poison:
81
49
; RV32: # %bb.0:
82
- ; RV32-NEXT: andi a1, a1, 1
83
- ; RV32-NEXT: slli a0, a0, 31
84
- ; RV32-NEXT: srai a0, a0, 31
85
- ; RV32-NEXT: andi a0, a0, 2
86
- ; RV32-NEXT: bltu a1, a0, .LBB1_2
87
- ; RV32-NEXT: # %bb.1:
88
- ; RV32-NEXT: mv a0, a1
89
- ; RV32-NEXT: .LBB1_2:
50
+ ; RV32-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
51
+ ; RV32-NEXT: vmv.v.i v8, 0
52
+ ; RV32-NEXT: vmerge.vim v8, v8, -1, v0
53
+ ; RV32-NEXT: vid.v v9
54
+ ; RV32-NEXT: vrsub.vi v9, v9, 2
55
+ ; RV32-NEXT: vand.vv v8, v8, v9
56
+ ; RV32-NEXT: vredmaxu.vs v8, v8, v8
57
+ ; RV32-NEXT: vmv.x.s a0, v8
90
58
; RV32-NEXT: li a1, 2
91
59
; RV32-NEXT: sub a1, a1, a0
92
60
; RV32-NEXT: andi a0, a1, 255
93
61
; RV32-NEXT: ret
94
62
;
95
63
; RV64-LABEL: ctz_v2i1_poison:
96
64
; RV64: # %bb.0:
97
- ; RV64-NEXT: andi a1, a1, 1
98
- ; RV64-NEXT: slli a0, a0, 63
99
- ; RV64-NEXT: srai a0, a0, 63
100
- ; RV64-NEXT: andi a0, a0, 2
101
- ; RV64-NEXT: bltu a1, a0, .LBB1_2
102
- ; RV64-NEXT: # %bb.1:
103
- ; RV64-NEXT: mv a0, a1
104
- ; RV64-NEXT: .LBB1_2:
65
+ ; RV64-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
66
+ ; RV64-NEXT: vmv.v.i v8, 0
67
+ ; RV64-NEXT: vmerge.vim v8, v8, -1, v0
68
+ ; RV64-NEXT: vid.v v9
69
+ ; RV64-NEXT: vrsub.vi v9, v9, 2
70
+ ; RV64-NEXT: vand.vv v8, v8, v9
71
+ ; RV64-NEXT: vredmaxu.vs v8, v8, v8
72
+ ; RV64-NEXT: vmv.x.s a0, v8
105
73
; RV64-NEXT: li a1, 2
106
74
; RV64-NEXT: subw a1, a1, a0
107
75
; RV64-NEXT: andi a0, a1, 255
0 commit comments