Skip to content

Commit 7b39f16

Browse files
committed
[RISCV] Made fsqrtv pseudoinstruction SEW-aware
1 parent 3cf7e35 commit 7b39f16

File tree

4 files changed

+99
-18
lines changed

4 files changed

+99
-18
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td

Lines changed: 93 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,18 +2328,25 @@ multiclass VPseudoVCLS_V {
23282328
multiclass VPseudoVSQR_V {
23292329
foreach m = MxListF in {
23302330
defvar mx = m.MX;
2331-
defvar WriteVFSqrtV_MX = !cast<SchedWrite>("WriteVFSqrtV_" # mx);
2332-
defvar ReadVFSqrtV_MX = !cast<SchedRead>("ReadVFSqrtV_" # mx);
2331+
defvar sews = SchedSEWSet<m.MX>.val;
23332332

2334-
let VLMul = m.value in {
2335-
def "_V_" # mx : VPseudoUnaryNoMask<m.vrclass, m.vrclass>,
2336-
Sched<[WriteVFSqrtV_MX, ReadVFSqrtV_MX, ReadVMask]>;
2337-
def "_V_" # mx # "_TU": VPseudoUnaryNoMaskTU<m.vrclass, m.vrclass>,
2338-
Sched<[WriteVFSqrtV_MX, ReadVFSqrtV_MX, ReadVMask]>;
2339-
def "_V_" # mx # "_MASK" : VPseudoUnaryMaskTA<m.vrclass, m.vrclass>,
2340-
RISCVMaskedPseudo</*MaskOpIdx*/ 2>,
2341-
Sched<[WriteVFSqrtV_MX, ReadVFSqrtV_MX, ReadVMask]>;
2342-
}
2333+
let VLMul = m.value in
2334+
foreach e = sews in {
2335+
defvar suffix = "_" # mx # "_E" # e;
2336+
defvar WriteVFSqrtV_MX_E = !cast<SchedWrite>("WriteVFSqrtV" # suffix);
2337+
defvar ReadVFSqrtV_MX_E = !cast<SchedRead>("ReadVFSqrtV" # suffix);
2338+
2339+
def "_V" # suffix : VPseudoUnaryNoMask<m.vrclass, m.vrclass>,
2340+
Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E,
2341+
ReadVMask]>;
2342+
def "_V" # suffix # "_TU": VPseudoUnaryNoMaskTU<m.vrclass, m.vrclass>,
2343+
Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E,
2344+
ReadVMask]>;
2345+
def "_V" # suffix # "_MASK" : VPseudoUnaryMaskTA<m.vrclass, m.vrclass>,
2346+
RISCVMaskedPseudo</*MaskOpIdx*/ 2>,
2347+
Sched<[WriteVFSqrtV_MX_E, ReadVFSqrtV_MX_E,
2348+
ReadVMask]>;
2349+
}
23432350
}
23442351
}
23452352

@@ -3835,6 +3842,23 @@ class VPatUnaryNoMask<string intrinsic_name,
38353842
(op2_type op2_reg_class:$rs2),
38363843
GPR:$vl, sew)>;
38373844

3845+
class VPatUnaryNoMask_E<string intrinsic_name,
3846+
string inst,
3847+
string kind,
3848+
ValueType result_type,
3849+
ValueType op2_type,
3850+
int log2sew,
3851+
LMULInfo vlmul,
3852+
int sew,
3853+
VReg op2_reg_class> :
3854+
Pat<(result_type (!cast<Intrinsic>(intrinsic_name)
3855+
(result_type undef),
3856+
(op2_type op2_reg_class:$rs2),
3857+
VLOpFrag)),
3858+
(!cast<Instruction>(inst#"_"#kind#"_"#vlmul.MX#"_E"#sew)
3859+
(op2_type op2_reg_class:$rs2),
3860+
GPR:$vl, log2sew)>;
3861+
38383862
class VPatUnaryNoMaskTU<string intrinsic_name,
38393863
string inst,
38403864
string kind,
@@ -3853,6 +3877,25 @@ class VPatUnaryNoMaskTU<string intrinsic_name,
38533877
(op2_type op2_reg_class:$rs2),
38543878
GPR:$vl, sew)>;
38553879

3880+
class VPatUnaryNoMaskTU_E<string intrinsic_name,
3881+
string inst,
3882+
string kind,
3883+
ValueType result_type,
3884+
ValueType op2_type,
3885+
int log2sew,
3886+
LMULInfo vlmul,
3887+
int sew,
3888+
VReg result_reg_class,
3889+
VReg op2_reg_class> :
3890+
Pat<(result_type (!cast<Intrinsic>(intrinsic_name)
3891+
(result_type result_reg_class:$merge),
3892+
(op2_type op2_reg_class:$rs2),
3893+
VLOpFrag)),
3894+
(!cast<Instruction>(inst#"_"#kind#"_"#vlmul.MX#"_E"#sew#"_TU")
3895+
(result_type result_reg_class:$merge),
3896+
(op2_type op2_reg_class:$rs2),
3897+
GPR:$vl, log2sew)>;
3898+
38563899
class VPatUnaryMask<string intrinsic_name,
38573900
string inst,
38583901
string kind,
@@ -3893,6 +3936,27 @@ class VPatUnaryMaskTA<string intrinsic_name,
38933936
(op2_type op2_reg_class:$rs2),
38943937
(mask_type V0), GPR:$vl, sew, (XLenVT timm:$policy))>;
38953938

3939+
class VPatUnaryMaskTA_E<string intrinsic_name,
3940+
string inst,
3941+
string kind,
3942+
ValueType result_type,
3943+
ValueType op2_type,
3944+
ValueType mask_type,
3945+
int log2sew,
3946+
LMULInfo vlmul,
3947+
int sew,
3948+
VReg result_reg_class,
3949+
VReg op2_reg_class> :
3950+
Pat<(result_type (!cast<Intrinsic>(intrinsic_name#"_mask")
3951+
(result_type result_reg_class:$merge),
3952+
(op2_type op2_reg_class:$rs2),
3953+
(mask_type V0),
3954+
VLOpFrag, (XLenVT timm:$policy))),
3955+
(!cast<Instruction>(inst#"_"#kind#"_"#vlmul.MX#"_E"#sew#"_MASK")
3956+
(result_type result_reg_class:$merge),
3957+
(op2_type op2_reg_class:$rs2),
3958+
(mask_type V0), GPR:$vl, log2sew, (XLenVT timm:$policy))>;
3959+
38963960
class VPatMaskUnaryNoMask<string intrinsic_name,
38973961
string inst,
38983962
MTypeInfo mti> :
@@ -4336,6 +4400,23 @@ multiclass VPatUnaryV_V<string intrinsic, string instruction,
43364400
}
43374401
}
43384402

4403+
multiclass VPatUnaryV_V_E<string intrinsic, string instruction,
4404+
list<VTypeInfo> vtilist> {
4405+
foreach vti = vtilist in {
4406+
def : VPatUnaryNoMask_E<intrinsic, instruction, "V",
4407+
vti.Vector, vti.Vector,
4408+
vti.Log2SEW, vti.LMul, vti.SEW, vti.RegClass>;
4409+
def : VPatUnaryNoMaskTU_E<intrinsic, instruction, "V",
4410+
vti.Vector, vti.Vector,
4411+
vti.Log2SEW, vti.LMul, vti.SEW,
4412+
vti.RegClass, vti.RegClass>;
4413+
def : VPatUnaryMaskTA_E<intrinsic, instruction, "V",
4414+
vti.Vector, vti.Vector, vti.Mask,
4415+
vti.Log2SEW, vti.LMul, vti.SEW,
4416+
vti.RegClass, vti.RegClass>;
4417+
}
4418+
}
4419+
43394420
multiclass VPatNullaryV<string intrinsic, string instruction>
43404421
{
43414422
foreach vti = AllIntegerVectors in {
@@ -6292,7 +6373,7 @@ defm : VPatTernaryW_VV_VX<"int_riscv_vfwnmsac", "PseudoVFWNMSAC", AllWidenableFl
62926373
//===----------------------------------------------------------------------===//
62936374
// 13.8. Vector Floating-Point Square-Root Instruction
62946375
//===----------------------------------------------------------------------===//
6295-
defm : VPatUnaryV_V<"int_riscv_vfsqrt", "PseudoVFSQRT", AllFloatVectors>;
6376+
defm : VPatUnaryV_V_E<"int_riscv_vfsqrt", "PseudoVFSQRT", AllFloatVectors>;
62966377

62976378
//===----------------------------------------------------------------------===//
62986379
// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction

llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ defm : VPatWidenFPNegMulSacSDNode_VV_VF<"PseudoVFWNMSAC">;
10061006
foreach vti = AllFloatVectors in {
10071007
// 13.8. Vector Floating-Point Square-Root Instruction
10081008
def : Pat<(fsqrt (vti.Vector vti.RegClass:$rs2)),
1009-
(!cast<Instruction>("PseudoVFSQRT_V_"# vti.LMul.MX)
1009+
(!cast<Instruction>("PseudoVFSQRT_V_"# vti.LMul.MX#"_E"#vti.SEW)
10101010
vti.RegClass:$rs2, vti.AVL, vti.Log2SEW)>;
10111011

10121012
// 13.12. Vector Floating-Point Sign-Injection Instructions

llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1802,7 +1802,7 @@ foreach vti = AllFloatVectors in {
18021802
// 13.8. Vector Floating-Point Square-Root Instruction
18031803
def : Pat<(riscv_fsqrt_vl (vti.Vector vti.RegClass:$rs2), (vti.Mask V0),
18041804
VLOpFrag),
1805-
(!cast<Instruction>("PseudoVFSQRT_V_"# vti.LMul.MX #"_MASK")
1805+
(!cast<Instruction>("PseudoVFSQRT_V_"# vti.LMul.MX # "_E" # vti.SEW # "_MASK")
18061806
(vti.Vector (IMPLICIT_DEF)), vti.RegClass:$rs2,
18071807
(vti.Mask V0), GPR:$vl, vti.Log2SEW, TA_MA)>;
18081808

llvm/lib/Target/RISCV/RISCVScheduleV.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ defm "" : LMULSchedWrites<"WriteVFMulAddF">;
309309
defm "" : LMULSchedWritesFW<"WriteVFWMulAddV">;
310310
defm "" : LMULSchedWritesFW<"WriteVFWMulAddF">;
311311
// 13.8. Vector Floating-Point Square-Root Instruction
312-
defm "" : LMULSchedWrites<"WriteVFSqrtV">;
312+
defm "" : LMULSEWSchedWrites<"WriteVFSqrtV">;
313313
// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
314314
// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
315315
defm "" : LMULSchedWrites<"WriteVFRecpV">;
@@ -528,7 +528,7 @@ defm "" : LMULSchedReads<"ReadVFMulAddF">;
528528
defm "" : LMULSchedReadsFW<"ReadVFWMulAddV">;
529529
defm "" : LMULSchedReadsFW<"ReadVFWMulAddF">;
530530
// 13.8. Vector Floating-Point Square-Root Instruction
531-
defm "" : LMULSchedReads<"ReadVFSqrtV">;
531+
defm "" : LMULSEWSchedReads<"ReadVFSqrtV">;
532532
// 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
533533
// 13.10. Vector Floating-Point Reciprocal Estimate Instruction
534534
defm "" : LMULSchedReads<"ReadVFRecpV">;
@@ -757,7 +757,7 @@ defm "" : LMULWriteRes<"WriteVFMulAddV", []>;
757757
defm "" : LMULWriteRes<"WriteVFMulAddF", []>;
758758
defm "" : LMULWriteResFW<"WriteVFWMulAddV", []>;
759759
defm "" : LMULWriteResFW<"WriteVFWMulAddF", []>;
760-
defm "" : LMULWriteRes<"WriteVFSqrtV", []>;
760+
defm "" : LMULSEWWriteRes<"WriteVFSqrtV", []>;
761761
defm "" : LMULWriteRes<"WriteVFRecpV", []>;
762762
defm "" : LMULWriteRes<"WriteVFCmpV", []>;
763763
defm "" : LMULWriteRes<"WriteVFCmpF", []>;
@@ -907,7 +907,7 @@ defm "" : LMULReadAdvance<"ReadVFMulAddV", 0>;
907907
defm "" : LMULReadAdvance<"ReadVFMulAddF", 0>;
908908
defm "" : LMULReadAdvanceFW<"ReadVFWMulAddV", 0>;
909909
defm "" : LMULReadAdvanceFW<"ReadVFWMulAddF", 0>;
910-
defm "" : LMULReadAdvance<"ReadVFSqrtV", 0>;
910+
defm "" : LMULSEWReadAdvance<"ReadVFSqrtV", 0>;
911911
defm "" : LMULReadAdvance<"ReadVFRecpV", 0>;
912912
defm "" : LMULReadAdvance<"ReadVFCmpV", 0>;
913913
defm "" : LMULReadAdvance<"ReadVFCmpF", 0>;

0 commit comments

Comments
 (0)