5
5
define i16 @test_lshr_i48 (i48 %x ) {
6
6
; RV32-LABEL: test_lshr_i48:
7
7
; RV32: # %bb.0:
8
+ ; RV32-NEXT: lui a2, 16
9
+ ; RV32-NEXT: addi a2, a2, -1
10
+ ; RV32-NEXT: and a1, a1, a2
8
11
; RV32-NEXT: srli a0, a0, 16
12
+ ; RV32-NEXT: slli a1, a1, 16
13
+ ; RV32-NEXT: or a0, a0, a1
9
14
; RV32-NEXT: ret
10
15
;
11
16
; RV64-LABEL: test_lshr_i48:
12
17
; RV64: # %bb.0:
13
- ; RV64-NEXT: srliw a0, a0, 16
18
+ ; RV64-NEXT: li a1, -1
19
+ ; RV64-NEXT: srli a1, a1, 16
20
+ ; RV64-NEXT: and a0, a0, a1
21
+ ; RV64-NEXT: srli a0, a0, 16
14
22
; RV64-NEXT: ret
15
23
%lshr = lshr i48 %x , 16
16
24
%trunc = trunc i48 %lshr to i16
@@ -20,12 +28,18 @@ define i16 @test_lshr_i48(i48 %x) {
20
28
define i16 @test_ashr_i48 (i48 %x ) {
21
29
; RV32-LABEL: test_ashr_i48:
22
30
; RV32: # %bb.0:
23
- ; RV32-NEXT: srai a0, a0, 16
31
+ ; RV32-NEXT: slli a1, a1, 16
32
+ ; RV32-NEXT: srai a1, a1, 16
33
+ ; RV32-NEXT: srli a0, a0, 16
34
+ ; RV32-NEXT: slli a1, a1, 16
35
+ ; RV32-NEXT: or a0, a0, a1
24
36
; RV32-NEXT: ret
25
37
;
26
38
; RV64-LABEL: test_ashr_i48:
27
39
; RV64: # %bb.0:
28
- ; RV64-NEXT: sraiw a0, a0, 16
40
+ ; RV64-NEXT: slli a0, a0, 16
41
+ ; RV64-NEXT: srai a0, a0, 16
42
+ ; RV64-NEXT: srai a0, a0, 16
29
43
; RV64-NEXT: ret
30
44
%ashr = ashr i48 %x , 16
31
45
%trunc = trunc i48 %ashr to i16
@@ -40,7 +54,7 @@ define i16 @test_shl_i48(i48 %x) {
40
54
;
41
55
; RV64-LABEL: test_shl_i48:
42
56
; RV64: # %bb.0:
43
- ; RV64-NEXT: slliw a0, a0, 8
57
+ ; RV64-NEXT: slli a0, a0, 8
44
58
; RV64-NEXT: ret
45
59
%shl = shl i48 %x , 8
46
60
%trunc = trunc i48 %shl to i16
@@ -51,13 +65,34 @@ define i16 @test_lshr_i48_2(i48 %x, i48 %y) {
51
65
; RV32-LABEL: test_lshr_i48_2:
52
66
; RV32: # %bb.0:
53
67
; RV32-NEXT: andi a2, a2, 15
54
- ; RV32-NEXT: srl a0, a0, a2
68
+ ; RV32-NEXT: lui a3, 16
69
+ ; RV32-NEXT: addi a3, a3, -1
70
+ ; RV32-NEXT: li a4, 32
71
+ ; RV32-NEXT: and a1, a1, a3
72
+ ; RV32-NEXT: bltu a2, a4, .LBB3_2
73
+ ; RV32-NEXT: # %bb.1:
74
+ ; RV32-NEXT: addi a3, a2, -32
75
+ ; RV32-NEXT: srl a1, a1, a3
76
+ ; RV32-NEXT: bnez a2, .LBB3_3
77
+ ; RV32-NEXT: j .LBB3_4
78
+ ; RV32-NEXT: .LBB3_2:
79
+ ; RV32-NEXT: srl a3, a0, a2
80
+ ; RV32-NEXT: neg a4, a2
81
+ ; RV32-NEXT: sll a1, a1, a4
82
+ ; RV32-NEXT: or a1, a3, a1
83
+ ; RV32-NEXT: beqz a2, .LBB3_4
84
+ ; RV32-NEXT: .LBB3_3:
85
+ ; RV32-NEXT: mv a0, a1
86
+ ; RV32-NEXT: .LBB3_4:
55
87
; RV32-NEXT: ret
56
88
;
57
89
; RV64-LABEL: test_lshr_i48_2:
58
90
; RV64: # %bb.0:
59
91
; RV64-NEXT: andi a1, a1, 15
60
- ; RV64-NEXT: srlw a0, a0, a1
92
+ ; RV64-NEXT: li a2, -1
93
+ ; RV64-NEXT: srli a2, a2, 16
94
+ ; RV64-NEXT: and a0, a0, a2
95
+ ; RV64-NEXT: srl a0, a0, a1
61
96
; RV64-NEXT: ret
62
97
%and = and i48 %y , 15
63
98
%lshr = lshr i48 %x , %and
@@ -69,13 +104,32 @@ define i16 @test_ashr_i48_2(i48 %x, i48 %y) {
69
104
; RV32-LABEL: test_ashr_i48_2:
70
105
; RV32: # %bb.0:
71
106
; RV32-NEXT: andi a2, a2, 15
72
- ; RV32-NEXT: sra a0, a0, a2
107
+ ; RV32-NEXT: slli a1, a1, 16
108
+ ; RV32-NEXT: li a3, 32
109
+ ; RV32-NEXT: srai a1, a1, 16
110
+ ; RV32-NEXT: bltu a2, a3, .LBB4_2
111
+ ; RV32-NEXT: # %bb.1:
112
+ ; RV32-NEXT: addi a3, a2, -32
113
+ ; RV32-NEXT: sra a1, a1, a3
114
+ ; RV32-NEXT: bnez a2, .LBB4_3
115
+ ; RV32-NEXT: j .LBB4_4
116
+ ; RV32-NEXT: .LBB4_2:
117
+ ; RV32-NEXT: srl a3, a0, a2
118
+ ; RV32-NEXT: neg a4, a2
119
+ ; RV32-NEXT: sll a1, a1, a4
120
+ ; RV32-NEXT: or a1, a3, a1
121
+ ; RV32-NEXT: beqz a2, .LBB4_4
122
+ ; RV32-NEXT: .LBB4_3:
123
+ ; RV32-NEXT: mv a0, a1
124
+ ; RV32-NEXT: .LBB4_4:
73
125
; RV32-NEXT: ret
74
126
;
75
127
; RV64-LABEL: test_ashr_i48_2:
76
128
; RV64: # %bb.0:
77
129
; RV64-NEXT: andi a1, a1, 15
78
- ; RV64-NEXT: sraw a0, a0, a1
130
+ ; RV64-NEXT: slli a0, a0, 16
131
+ ; RV64-NEXT: srai a0, a0, 16
132
+ ; RV64-NEXT: sra a0, a0, a1
79
133
; RV64-NEXT: ret
80
134
%and = and i48 %y , 15
81
135
%ashr = ashr i48 %x , %and
@@ -87,13 +141,19 @@ define i16 @test_shl_i48_2(i48 %x, i48 %y) {
87
141
; RV32-LABEL: test_shl_i48_2:
88
142
; RV32: # %bb.0:
89
143
; RV32-NEXT: andi a2, a2, 15
144
+ ; RV32-NEXT: li a1, 32
145
+ ; RV32-NEXT: bltu a2, a1, .LBB5_2
146
+ ; RV32-NEXT: # %bb.1:
147
+ ; RV32-NEXT: li a0, 0
148
+ ; RV32-NEXT: ret
149
+ ; RV32-NEXT: .LBB5_2:
90
150
; RV32-NEXT: sll a0, a0, a2
91
151
; RV32-NEXT: ret
92
152
;
93
153
; RV64-LABEL: test_shl_i48_2:
94
154
; RV64: # %bb.0:
95
155
; RV64-NEXT: andi a1, a1, 15
96
- ; RV64-NEXT: sllw a0, a0, a1
156
+ ; RV64-NEXT: sll a0, a0, a1
97
157
; RV64-NEXT: ret
98
158
%and = and i48 %y , 15
99
159
%shl = shl i48 %x , %and
0 commit comments