@@ -2004,19 +2004,28 @@ multiclass VPseudoSSegLoad {
2004
2004
}
2005
2005
2006
2006
multiclass VPseudoISegLoad<bit Ordered> {
2007
- foreach idx_eew = EEWList in { // EEW for index argument.
2008
- foreach idx_lmul = MxSet<idx_eew>.m in { // LMUL for index argument.
2009
- foreach val_lmul = MxList.m in { // LMUL for the value.
2010
- defvar IdxLInfo = idx_lmul.MX;
2011
- defvar IdxVreg = idx_lmul.vrclass;
2012
- defvar ValLInfo = val_lmul.MX;
2013
- let VLMul = val_lmul.value in {
2014
- foreach nf = NFSet<val_lmul>.L in {
2015
- defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2016
- def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2017
- VPseudoISegLoadNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2018
- def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2019
- VPseudoISegLoadMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2007
+ foreach idx_eew = EEWList in {
2008
+ foreach sew = EEWList in {
2009
+ foreach val_lmul = MxSet<sew>.m in {
2010
+ defvar octuple_lmul = octuple_from_str<val_lmul.MX>.ret;
2011
+ // Calculate emul = eew * lmul / sew
2012
+ defvar octuple_emul = !srl(!mul(idx_eew, octuple_lmul), shift_amount<sew>.val);
2013
+ if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then {
2014
+ defvar ValLInfo = val_lmul.MX;
2015
+ defvar IdxLInfo = octuple_to_str<octuple_emul>.ret;
2016
+ defvar idx_lmul = !cast<LMULInfo>("V_" # IdxLInfo);
2017
+ defvar Vreg = val_lmul.vrclass;
2018
+ defvar IdxVreg = idx_lmul.vrclass;
2019
+ let VLMul = val_lmul.value in {
2020
+ foreach nf = NFSet<val_lmul>.L in {
2021
+ defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2022
+ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2023
+ VPseudoISegLoadNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2024
+ nf, Ordered>;
2025
+ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2026
+ VPseudoISegLoadMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2027
+ nf, Ordered>;
2028
+ }
2020
2029
}
2021
2030
}
2022
2031
}
@@ -2055,19 +2064,28 @@ multiclass VPseudoSSegStore {
2055
2064
}
2056
2065
2057
2066
multiclass VPseudoISegStore<bit Ordered> {
2058
- foreach idx_eew = EEWList in { // EEW for index argument.
2059
- foreach idx_lmul = MxSet<idx_eew>.m in { // LMUL for index argument.
2060
- foreach val_lmul = MxList.m in { // LMUL for the value.
2061
- defvar IdxLInfo = idx_lmul.MX;
2062
- defvar IdxVreg = idx_lmul.vrclass;
2063
- defvar ValLInfo = val_lmul.MX;
2064
- let VLMul = val_lmul.value in {
2065
- foreach nf = NFSet<val_lmul>.L in {
2066
- defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2067
- def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2068
- VPseudoISegStoreNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2069
- def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2070
- VPseudoISegStoreMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value, nf, Ordered>;
2067
+ foreach idx_eew = EEWList in {
2068
+ foreach sew = EEWList in {
2069
+ foreach val_lmul = MxSet<sew>.m in {
2070
+ defvar octuple_lmul = octuple_from_str<val_lmul.MX>.ret;
2071
+ // Calculate emul = eew * lmul / sew
2072
+ defvar octuple_emul = !srl(!mul(idx_eew, octuple_lmul), shift_amount<sew>.val);
2073
+ if !and(!ge(octuple_emul, 1), !le(octuple_emul, 64)) then {
2074
+ defvar ValLInfo = val_lmul.MX;
2075
+ defvar IdxLInfo = octuple_to_str<octuple_emul>.ret;
2076
+ defvar idx_lmul = !cast<LMULInfo>("V_" # IdxLInfo);
2077
+ defvar Vreg = val_lmul.vrclass;
2078
+ defvar IdxVreg = idx_lmul.vrclass;
2079
+ let VLMul = val_lmul.value in {
2080
+ foreach nf = NFSet<val_lmul>.L in {
2081
+ defvar ValVreg = SegRegClass<val_lmul, nf>.RC;
2082
+ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo :
2083
+ VPseudoISegStoreNoMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2084
+ nf, Ordered>;
2085
+ def nf # "EI" # idx_eew # "_V_" # IdxLInfo # "_" # ValLInfo # "_MASK" :
2086
+ VPseudoISegStoreMask<ValVreg, IdxVreg, idx_eew, idx_lmul.value,
2087
+ nf, Ordered>;
2088
+ }
2071
2089
}
2072
2090
}
2073
2091
}
0 commit comments