11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
3- ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4- ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+zba,+zbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
5- ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64V
6- ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+rva22u64 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RVA22U64
3+ ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZVFH
4+ ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zfh,+zvfh,+zba,+zbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZVFH
5+ ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZVFH,RV64V
6+ ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zfh,+zvfh,+rva22u64 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZVFH,RVA22U64
7+ ; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zvfhmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZVFHMIN
8+ ; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zvfhmin,+f,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZVFHMIN
79
810; Tests that a floating-point build_vector doesn't try and generate a VID
911; instruction
@@ -249,6 +251,20 @@ define dso_local void @splat_load_licm(ptr %0) {
249251; RVA22U64-NEXT: bne a0, a1, .LBB12_1
250252; RVA22U64-NEXT: # %bb.2:
251253; RVA22U64-NEXT: ret
254+ ;
255+ ; RV64ZVFHMIN-LABEL: splat_load_licm:
256+ ; RV64ZVFHMIN: # %bb.0:
257+ ; RV64ZVFHMIN-NEXT: lui a1, 1
258+ ; RV64ZVFHMIN-NEXT: add a1, a0, a1
259+ ; RV64ZVFHMIN-NEXT: lui a2, 263168
260+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 4, e32, m1, ta, ma
261+ ; RV64ZVFHMIN-NEXT: vmv.v.x v8, a2
262+ ; RV64ZVFHMIN-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1
263+ ; RV64ZVFHMIN-NEXT: vse32.v v8, (a0)
264+ ; RV64ZVFHMIN-NEXT: addi a0, a0, 16
265+ ; RV64ZVFHMIN-NEXT: bne a0, a1, .LBB12_1
266+ ; RV64ZVFHMIN-NEXT: # %bb.2:
267+ ; RV64ZVFHMIN-NEXT: ret
252268 br label %2
253269
2542702 : ; preds = %2, %1
@@ -265,12 +281,37 @@ define dso_local void @splat_load_licm(ptr %0) {
265281}
266282
267283define <2 x half > @buildvec_v2f16 (half %a , half %b ) {
268- ; CHECK-LABEL: buildvec_v2f16:
269- ; CHECK: # %bb.0:
270- ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
271- ; CHECK-NEXT: vfmv.v.f v8, fa0
272- ; CHECK-NEXT: vfslide1down.vf v8, v8, fa1
273- ; CHECK-NEXT: ret
284+ ; RV32ZVFH-LABEL: buildvec_v2f16:
285+ ; RV32ZVFH: # %bb.0:
286+ ; RV32ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
287+ ; RV32ZVFH-NEXT: vfmv.v.f v8, fa0
288+ ; RV32ZVFH-NEXT: vfslide1down.vf v8, v8, fa1
289+ ; RV32ZVFH-NEXT: ret
290+ ;
291+ ; RV64ZVFH-LABEL: buildvec_v2f16:
292+ ; RV64ZVFH: # %bb.0:
293+ ; RV64ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
294+ ; RV64ZVFH-NEXT: vfmv.v.f v8, fa0
295+ ; RV64ZVFH-NEXT: vfslide1down.vf v8, v8, fa1
296+ ; RV64ZVFH-NEXT: ret
297+ ;
298+ ; RV32ZVFHMIN-LABEL: buildvec_v2f16:
299+ ; RV32ZVFHMIN: # %bb.0:
300+ ; RV32ZVFHMIN-NEXT: fmv.x.w a0, fa1
301+ ; RV32ZVFHMIN-NEXT: fmv.x.w a1, fa0
302+ ; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
303+ ; RV32ZVFHMIN-NEXT: vmv.v.x v8, a1
304+ ; RV32ZVFHMIN-NEXT: vslide1down.vx v8, v8, a0
305+ ; RV32ZVFHMIN-NEXT: ret
306+ ;
307+ ; RV64ZVFHMIN-LABEL: buildvec_v2f16:
308+ ; RV64ZVFHMIN: # %bb.0:
309+ ; RV64ZVFHMIN-NEXT: fmv.x.w a0, fa1
310+ ; RV64ZVFHMIN-NEXT: fmv.x.w a1, fa0
311+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
312+ ; RV64ZVFHMIN-NEXT: vmv.v.x v8, a1
313+ ; RV64ZVFHMIN-NEXT: vslide1down.vx v8, v8, a0
314+ ; RV64ZVFHMIN-NEXT: ret
274315 %v1 = insertelement <2 x half > poison, half %a , i64 0
275316 %v2 = insertelement <2 x half > %v1 , half %b , i64 1
276317 ret <2 x half > %v2
@@ -1297,45 +1338,136 @@ entry:
12971338}
12981339
12991340define <2 x half > @vid_v2f16 () {
1300- ; CHECK-LABEL: vid_v2f16:
1301- ; CHECK: # %bb.0:
1302- ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1303- ; CHECK-NEXT: vid.v v8
1304- ; CHECK-NEXT: vfcvt.f.x.v v8, v8
1305- ; CHECK-NEXT: ret
1341+ ; RV32ZVFH-LABEL: vid_v2f16:
1342+ ; RV32ZVFH: # %bb.0:
1343+ ; RV32ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1344+ ; RV32ZVFH-NEXT: vid.v v8
1345+ ; RV32ZVFH-NEXT: vfcvt.f.x.v v8, v8
1346+ ; RV32ZVFH-NEXT: ret
1347+ ;
1348+ ; RV64ZVFH-LABEL: vid_v2f16:
1349+ ; RV64ZVFH: # %bb.0:
1350+ ; RV64ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1351+ ; RV64ZVFH-NEXT: vid.v v8
1352+ ; RV64ZVFH-NEXT: vfcvt.f.x.v v8, v8
1353+ ; RV64ZVFH-NEXT: ret
1354+ ;
1355+ ; RV32ZVFHMIN-LABEL: vid_v2f16:
1356+ ; RV32ZVFHMIN: # %bb.0:
1357+ ; RV32ZVFHMIN-NEXT: lui a0, 245760
1358+ ; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1359+ ; RV32ZVFHMIN-NEXT: vmv.s.x v8, a0
1360+ ; RV32ZVFHMIN-NEXT: ret
1361+ ;
1362+ ; RV64ZVFHMIN-LABEL: vid_v2f16:
1363+ ; RV64ZVFHMIN: # %bb.0:
1364+ ; RV64ZVFHMIN-NEXT: lui a0, 245760
1365+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1366+ ; RV64ZVFHMIN-NEXT: vmv.s.x v8, a0
1367+ ; RV64ZVFHMIN-NEXT: ret
13061368 ret <2 x half > <half 0 .0 , half 1 .0 >
13071369}
13081370
13091371define <2 x half > @vid_addend1_v2f16 () {
1310- ; CHECK-LABEL: vid_addend1_v2f16:
1311- ; CHECK: # %bb.0:
1312- ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1313- ; CHECK-NEXT: vid.v v8
1314- ; CHECK-NEXT: vadd.vi v8, v8, 1
1315- ; CHECK-NEXT: vfcvt.f.x.v v8, v8
1316- ; CHECK-NEXT: ret
1372+ ; RV32ZVFH-LABEL: vid_addend1_v2f16:
1373+ ; RV32ZVFH: # %bb.0:
1374+ ; RV32ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1375+ ; RV32ZVFH-NEXT: vid.v v8
1376+ ; RV32ZVFH-NEXT: vadd.vi v8, v8, 1
1377+ ; RV32ZVFH-NEXT: vfcvt.f.x.v v8, v8
1378+ ; RV32ZVFH-NEXT: ret
1379+ ;
1380+ ; RV64ZVFH-LABEL: vid_addend1_v2f16:
1381+ ; RV64ZVFH: # %bb.0:
1382+ ; RV64ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1383+ ; RV64ZVFH-NEXT: vid.v v8
1384+ ; RV64ZVFH-NEXT: vadd.vi v8, v8, 1
1385+ ; RV64ZVFH-NEXT: vfcvt.f.x.v v8, v8
1386+ ; RV64ZVFH-NEXT: ret
1387+ ;
1388+ ; RV32ZVFHMIN-LABEL: vid_addend1_v2f16:
1389+ ; RV32ZVFHMIN: # %bb.0:
1390+ ; RV32ZVFHMIN-NEXT: lui a0, 262148
1391+ ; RV32ZVFHMIN-NEXT: addi a0, a0, -1024
1392+ ; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1393+ ; RV32ZVFHMIN-NEXT: vmv.s.x v8, a0
1394+ ; RV32ZVFHMIN-NEXT: ret
1395+ ;
1396+ ; RV64ZVFHMIN-LABEL: vid_addend1_v2f16:
1397+ ; RV64ZVFHMIN: # %bb.0:
1398+ ; RV64ZVFHMIN-NEXT: lui a0, 262148
1399+ ; RV64ZVFHMIN-NEXT: addi a0, a0, -1024
1400+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1401+ ; RV64ZVFHMIN-NEXT: vmv.s.x v8, a0
1402+ ; RV64ZVFHMIN-NEXT: ret
13171403 ret <2 x half > <half 1 .0 , half 2 .0 >
13181404}
13191405
13201406define <2 x half > @vid_denominator2_v2f16 () {
1321- ; CHECK-LABEL: vid_denominator2_v2f16:
1322- ; CHECK: # %bb.0:
1323- ; CHECK-NEXT: lui a0, %hi(.LCPI28_0)
1324- ; CHECK-NEXT: addi a0, a0, %lo(.LCPI28_0)
1325- ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1326- ; CHECK-NEXT: vle16.v v8, (a0)
1327- ; CHECK-NEXT: ret
1407+ ; RV32ZVFH-LABEL: vid_denominator2_v2f16:
1408+ ; RV32ZVFH: # %bb.0:
1409+ ; RV32ZVFH-NEXT: lui a0, %hi(.LCPI28_0)
1410+ ; RV32ZVFH-NEXT: addi a0, a0, %lo(.LCPI28_0)
1411+ ; RV32ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1412+ ; RV32ZVFH-NEXT: vle16.v v8, (a0)
1413+ ; RV32ZVFH-NEXT: ret
1414+ ;
1415+ ; RV64ZVFH-LABEL: vid_denominator2_v2f16:
1416+ ; RV64ZVFH: # %bb.0:
1417+ ; RV64ZVFH-NEXT: lui a0, %hi(.LCPI28_0)
1418+ ; RV64ZVFH-NEXT: addi a0, a0, %lo(.LCPI28_0)
1419+ ; RV64ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1420+ ; RV64ZVFH-NEXT: vle16.v v8, (a0)
1421+ ; RV64ZVFH-NEXT: ret
1422+ ;
1423+ ; RV32ZVFHMIN-LABEL: vid_denominator2_v2f16:
1424+ ; RV32ZVFHMIN: # %bb.0:
1425+ ; RV32ZVFHMIN-NEXT: lui a0, 245764
1426+ ; RV32ZVFHMIN-NEXT: addi a0, a0, -2048
1427+ ; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1428+ ; RV32ZVFHMIN-NEXT: vmv.s.x v8, a0
1429+ ; RV32ZVFHMIN-NEXT: ret
1430+ ;
1431+ ; RV64ZVFHMIN-LABEL: vid_denominator2_v2f16:
1432+ ; RV64ZVFHMIN: # %bb.0:
1433+ ; RV64ZVFHMIN-NEXT: lui a0, 245764
1434+ ; RV64ZVFHMIN-NEXT: addi a0, a0, -2048
1435+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 2, e32, m1, ta, ma
1436+ ; RV64ZVFHMIN-NEXT: vmv.s.x v8, a0
1437+ ; RV64ZVFHMIN-NEXT: ret
13281438 ret <2 x half > <half 0 .5 , half 1 .0 >
13291439}
13301440
13311441define <2 x half > @vid_step2_v2f16 () {
1332- ; CHECK-LABEL: vid_step2_v2f16:
1333- ; CHECK: # %bb.0:
1334- ; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1335- ; CHECK-NEXT: vid.v v8
1336- ; CHECK-NEXT: vadd.vv v8, v8, v8
1337- ; CHECK-NEXT: vfcvt.f.x.v v8, v8
1338- ; CHECK-NEXT: ret
1442+ ; RV32ZVFH-LABEL: vid_step2_v2f16:
1443+ ; RV32ZVFH: # %bb.0:
1444+ ; RV32ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1445+ ; RV32ZVFH-NEXT: vid.v v8
1446+ ; RV32ZVFH-NEXT: vadd.vv v8, v8, v8
1447+ ; RV32ZVFH-NEXT: vfcvt.f.x.v v8, v8
1448+ ; RV32ZVFH-NEXT: ret
1449+ ;
1450+ ; RV64ZVFH-LABEL: vid_step2_v2f16:
1451+ ; RV64ZVFH: # %bb.0:
1452+ ; RV64ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1453+ ; RV64ZVFH-NEXT: vid.v v8
1454+ ; RV64ZVFH-NEXT: vadd.vv v8, v8, v8
1455+ ; RV64ZVFH-NEXT: vfcvt.f.x.v v8, v8
1456+ ; RV64ZVFH-NEXT: ret
1457+ ;
1458+ ; RV32ZVFHMIN-LABEL: vid_step2_v2f16:
1459+ ; RV32ZVFHMIN: # %bb.0:
1460+ ; RV32ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1461+ ; RV32ZVFHMIN-NEXT: vid.v v8
1462+ ; RV32ZVFHMIN-NEXT: vsll.vi v8, v8, 14
1463+ ; RV32ZVFHMIN-NEXT: ret
1464+ ;
1465+ ; RV64ZVFHMIN-LABEL: vid_step2_v2f16:
1466+ ; RV64ZVFHMIN: # %bb.0:
1467+ ; RV64ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
1468+ ; RV64ZVFHMIN-NEXT: vid.v v8
1469+ ; RV64ZVFHMIN-NEXT: vsll.vi v8, v8, 14
1470+ ; RV64ZVFHMIN-NEXT: ret
13391471 ret <2 x half > <half 0 .0 , half 2 .0 >
13401472}
13411473
0 commit comments