|
2 | 2 | ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
|
3 | 3 | ; RUN: | FileCheck %s -check-prefix=RV64I
|
4 | 4 | ; RUN: llc -mtriple=riscv64 -mattr=+m,+zba -verify-machineinstrs < %s \
|
5 |
| -; RUN: | FileCheck %s -check-prefix=RV64ZBA |
| 5 | +; RUN: | FileCheck %s -check-prefixes=RV64ZBA,RV64ZBANOZBB |
| 6 | +; RUN: llc -mtriple=riscv64 -mattr=+m,+zba,+zbb -verify-machineinstrs < %s \ |
| 7 | +; RUN: | FileCheck %s -check-prefixes=RV64ZBA,RV64ZBAZBB |
6 | 8 |
|
7 | 9 | define i64 @slliuw(i64 %a) nounwind {
|
8 | 10 | ; RV64I-LABEL: slliuw:
|
@@ -1155,3 +1157,63 @@ define i64 @addshl64_5_8(i64 %a, i64 %b) {
|
1155 | 1157 | %e = add i64 %c, %d
|
1156 | 1158 | ret i64 %e
|
1157 | 1159 | }
|
| 1160 | + |
| 1161 | +; Make sure we use sext.h+slli+srli for Zba+Zbb. |
| 1162 | +; FIXME: The RV64I and Zba only cases can be done with only 3 shifts. |
| 1163 | +define zeroext i32 @sext_ashr_zext_i8(i8 %a) nounwind { |
| 1164 | +; RV64I-LABEL: sext_ashr_zext_i8: |
| 1165 | +; RV64I: # %bb.0: |
| 1166 | +; RV64I-NEXT: slli a0, a0, 56 |
| 1167 | +; RV64I-NEXT: srai a0, a0, 56 |
| 1168 | +; RV64I-NEXT: slli a0, a0, 23 |
| 1169 | +; RV64I-NEXT: srli a0, a0, 32 |
| 1170 | +; RV64I-NEXT: ret |
| 1171 | +; |
| 1172 | +; RV64ZBANOZBB-LABEL: sext_ashr_zext_i8: |
| 1173 | +; RV64ZBANOZBB: # %bb.0: |
| 1174 | +; RV64ZBANOZBB-NEXT: slli a0, a0, 56 |
| 1175 | +; RV64ZBANOZBB-NEXT: srai a0, a0, 56 |
| 1176 | +; RV64ZBANOZBB-NEXT: slli a0, a0, 23 |
| 1177 | +; RV64ZBANOZBB-NEXT: srli a0, a0, 32 |
| 1178 | +; RV64ZBANOZBB-NEXT: ret |
| 1179 | +; |
| 1180 | +; RV64ZBAZBB-LABEL: sext_ashr_zext_i8: |
| 1181 | +; RV64ZBAZBB: # %bb.0: |
| 1182 | +; RV64ZBAZBB-NEXT: sext.b a0, a0 |
| 1183 | +; RV64ZBAZBB-NEXT: slli a0, a0, 23 |
| 1184 | +; RV64ZBAZBB-NEXT: srli a0, a0, 32 |
| 1185 | +; RV64ZBAZBB-NEXT: ret |
| 1186 | + %ext = sext i8 %a to i32 |
| 1187 | + %1 = ashr i32 %ext, 9 |
| 1188 | + ret i32 %1 |
| 1189 | +} |
| 1190 | + |
| 1191 | +; Make sure we use sext.h+slli+srli for Zba+Zbb. |
| 1192 | +; FIXME: The RV64I and Zba only cases can be done with only 3 shifts. |
| 1193 | +define zeroext i32 @sext_ashr_zext_i16(i16 %a) nounwind { |
| 1194 | +; RV64I-LABEL: sext_ashr_zext_i16: |
| 1195 | +; RV64I: # %bb.0: |
| 1196 | +; RV64I-NEXT: slli a0, a0, 48 |
| 1197 | +; RV64I-NEXT: srai a0, a0, 48 |
| 1198 | +; RV64I-NEXT: slli a0, a0, 23 |
| 1199 | +; RV64I-NEXT: srli a0, a0, 32 |
| 1200 | +; RV64I-NEXT: ret |
| 1201 | +; |
| 1202 | +; RV64ZBANOZBB-LABEL: sext_ashr_zext_i16: |
| 1203 | +; RV64ZBANOZBB: # %bb.0: |
| 1204 | +; RV64ZBANOZBB-NEXT: slli a0, a0, 48 |
| 1205 | +; RV64ZBANOZBB-NEXT: srai a0, a0, 48 |
| 1206 | +; RV64ZBANOZBB-NEXT: slli a0, a0, 23 |
| 1207 | +; RV64ZBANOZBB-NEXT: srli a0, a0, 32 |
| 1208 | +; RV64ZBANOZBB-NEXT: ret |
| 1209 | +; |
| 1210 | +; RV64ZBAZBB-LABEL: sext_ashr_zext_i16: |
| 1211 | +; RV64ZBAZBB: # %bb.0: |
| 1212 | +; RV64ZBAZBB-NEXT: sext.h a0, a0 |
| 1213 | +; RV64ZBAZBB-NEXT: slli a0, a0, 23 |
| 1214 | +; RV64ZBAZBB-NEXT: srli a0, a0, 32 |
| 1215 | +; RV64ZBAZBB-NEXT: ret |
| 1216 | + %ext = sext i16 %a to i32 |
| 1217 | + %1 = ashr i32 %ext, 9 |
| 1218 | + ret i32 %1 |
| 1219 | +} |
0 commit comments