diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -1286,15 +1286,22 @@ multiclass VPseudoILoad { foreach eew = EEWList in { - foreach lmul = MxList.m in - foreach idx_lmul = MxSet.m in { - defvar LInfo = lmul.MX; - defvar Vreg = lmul.vrclass; - defvar IdxLInfo = idx_lmul.MX; - defvar IdxVreg = idx_lmul.vrclass; - let VLMul = lmul.value in { - def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : VPseudoILoadNoMask; - def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : VPseudoILoadMask; + foreach sew = EEWList in { + foreach lmul = MxSet.m in { + defvar octuple_lmul = octuple_from_str.ret; + // Calculate emul = eew * lmul / sew + defvar octuple_emul = !srl(!mul(eew, octuple_lmul), shift_amount.val); + if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then { + defvar LInfo = lmul.MX; + defvar IdxLInfo = octuple_to_str.ret; + defvar idx_lmul = !cast("V_" # IdxLInfo); + defvar Vreg = lmul.vrclass; + defvar IdxVreg = idx_lmul.vrclass; + let VLMul = lmul.value in { + def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : VPseudoILoadNoMask; + def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : VPseudoILoadMask; + } + } } } } @@ -1336,17 +1343,24 @@ multiclass VPseudoIStore { foreach eew = EEWList in { - foreach lmul = MxList.m in - foreach idx_lmul = MxSet.m in { - defvar LInfo = lmul.MX; - defvar Vreg = lmul.vrclass; - defvar IdxLInfo = idx_lmul.MX; - defvar IdxVreg = idx_lmul.vrclass; - let VLMul = lmul.value in { - def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : - VPseudoIStoreNoMask; - def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : - VPseudoIStoreMask; + foreach sew = EEWList in { + foreach lmul = MxSet.m in { + defvar octuple_lmul = octuple_from_str.ret; + // Calculate emul = eew * lmul / sew + defvar octuple_emul = !srl(!mul(eew, octuple_lmul), shift_amount.val); + if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then { + defvar LInfo = lmul.MX; + defvar IdxLInfo = octuple_to_str.ret; + defvar idx_lmul = !cast("V_" # IdxLInfo); + defvar Vreg = lmul.vrclass; + defvar IdxVreg = idx_lmul.vrclass; + let VLMul = lmul.value in { + def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo : + VPseudoIStoreNoMask; + def "EI" # eew # "_V_" # IdxLInfo # "_" # LInfo # "_MASK" : + VPseudoIStoreMask; + } + } } } }