Skip to content

Commit af999c4

Browse files
authored
[LoongArch] Add codegen support for [X]VF{MSUB/NMADD/NMSUB}.{S/D} instructions (#74819)
This is similar to single and double-precision floating-point instructions.
1 parent 9406ea3 commit af999c4

File tree

6 files changed

+3268
-0
lines changed

6 files changed

+3268
-0
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,32 @@ def : Pat<(fma v8f32:$xj, v8f32:$xk, v8f32:$xa),
14551455
def : Pat<(fma v4f64:$xj, v4f64:$xk, v4f64:$xa),
14561456
(XVFMADD_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
14571457

1458+
// XVFMSUB_{S/D}
1459+
def : Pat<(fma v8f32:$xj, v8f32:$xk, (fneg v8f32:$xa)),
1460+
(XVFMSUB_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
1461+
def : Pat<(fma v4f64:$xj, v4f64:$xk, (fneg v4f64:$xa)),
1462+
(XVFMSUB_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
1463+
1464+
// XVFNMADD_{S/D}
1465+
def : Pat<(fneg (fma v8f32:$xj, v8f32:$xk, v8f32:$xa)),
1466+
(XVFNMADD_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
1467+
def : Pat<(fneg (fma v4f64:$xj, v4f64:$xk, v4f64:$xa)),
1468+
(XVFNMADD_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
1469+
def : Pat<(fma_nsz (fneg v8f32:$xj), v8f32:$xk, (fneg v8f32:$xa)),
1470+
(XVFNMADD_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
1471+
def : Pat<(fma_nsz (fneg v4f64:$xj), v4f64:$xk, (fneg v4f64:$xa)),
1472+
(XVFNMADD_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
1473+
1474+
// XVFNMSUB_{S/D}
1475+
def : Pat<(fneg (fma v8f32:$xj, v8f32:$xk, (fneg v8f32:$xa))),
1476+
(XVFNMSUB_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
1477+
def : Pat<(fneg (fma v4f64:$xj, v4f64:$xk, (fneg v4f64:$xa))),
1478+
(XVFNMSUB_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
1479+
def : Pat<(fma_nsz (fneg v8f32:$xj), v8f32:$xk, v8f32:$xa),
1480+
(XVFNMSUB_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>;
1481+
def : Pat<(fma_nsz (fneg v4f64:$xj), v4f64:$xk, v4f64:$xa),
1482+
(XVFNMSUB_D v4f64:$xj, v4f64:$xk, v4f64:$xa)>;
1483+
14581484
// XVFSQRT_{S/D}
14591485
defm : PatXrF<fsqrt, "XVFSQRT">;
14601486

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,32 @@ def : Pat<(fma v4f32:$vj, v4f32:$vk, v4f32:$va),
15551555
def : Pat<(fma v2f64:$vj, v2f64:$vk, v2f64:$va),
15561556
(VFMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
15571557

1558+
// VFMSUB_{S/D}
1559+
def : Pat<(fma v4f32:$vj, v4f32:$vk, (fneg v4f32:$va)),
1560+
(VFMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1561+
def : Pat<(fma v2f64:$vj, v2f64:$vk, (fneg v2f64:$va)),
1562+
(VFMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1563+
1564+
// VFNMADD_{S/D}
1565+
def : Pat<(fneg (fma v4f32:$vj, v4f32:$vk, v4f32:$va)),
1566+
(VFNMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1567+
def : Pat<(fneg (fma v2f64:$vj, v2f64:$vk, v2f64:$va)),
1568+
(VFNMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1569+
def : Pat<(fma_nsz (fneg v4f32:$vj), v4f32:$vk, (fneg v4f32:$va)),
1570+
(VFNMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1571+
def : Pat<(fma_nsz (fneg v2f64:$vj), v2f64:$vk, (fneg v2f64:$va)),
1572+
(VFNMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1573+
1574+
// VFNMSUB_{S/D}
1575+
def : Pat<(fneg (fma v4f32:$vj, v4f32:$vk, (fneg v4f32:$va))),
1576+
(VFNMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1577+
def : Pat<(fneg (fma v2f64:$vj, v2f64:$vk, (fneg v2f64:$va))),
1578+
(VFNMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1579+
def : Pat<(fma_nsz (fneg v4f32:$vj), v4f32:$vk, v4f32:$va),
1580+
(VFNMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1581+
def : Pat<(fma_nsz (fneg v2f64:$vj), v2f64:$vk, v2f64:$va),
1582+
(VFNMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1583+
15581584
// VFSQRT_{S/D}
15591585
defm : PatVrF<fsqrt, "VFSQRT">;
15601586

0 commit comments

Comments
 (0)