@@ -842,24 +842,25 @@ def main(root: str, files: Iterable[Filename], ver: str):
842
842
843
843
# H could be allowed maybe?
844
844
allowed_simply : Dict [str , str ] = {"ARM64" : "v" , "RV64" : "v" }
845
- allowed_regs : Dict [str , str ] = {"ARM64" : "cCwWiuIUlLp" , "RV64" : "CWuIUlLp " }
845
+ allowed_regs : Dict [str , str ] = {"ARM64" : "cCwWiuIUlLp" , "RV64" : "CWIUlLp " }
846
846
allowed_fpr : Dict [str , str ] = {"ARM64" : "fd" , "RV64" : "fd" }
847
+ allowed_sextw : Dict [str , str ] = {"ARM64" : "" , "RV64" : "cwiu" }
847
848
848
849
# Detect functions which return in an x87 register
849
850
retx87_wraps : Dict [ClausesStr , List [FunctionType ]] = {}
850
851
return_x87 : str = "D"
851
852
852
853
# Sanity checks
853
- forbidden_simple : Dict [str , str ] = {"ARM64" : "EDVOSNHPAxXYb" , "RV64" : "EcwiDVOSNHPAxXYb " }
854
+ forbidden_simple : Dict [str , str ] = {"ARM64" : "EDVOSNHPAxXYb" , "RV64" : "EDVOSNHPAxXYb " }
854
855
assert (all (k in allowed_simply for k in forbidden_simple ))
855
856
assert (all (k in allowed_regs for k in forbidden_simple ))
856
857
assert (all (k in allowed_fpr for k in forbidden_simple ))
857
858
for k1 in forbidden_simple :
858
- assert (len (allowed_simply [k1 ]) + len (allowed_regs [k1 ]) + len (allowed_fpr [k1 ]) + len (forbidden_simple [k1 ]) == len (allowed_conv .values ))
859
+ assert (len (allowed_simply [k1 ]) + len (allowed_regs [k1 ]) + len (allowed_fpr [k1 ]) + len (allowed_sextw [ k1 ]) + len ( forbidden_simple [k1 ]) == len (allowed_conv .values ))
859
860
assert (all (c not in allowed_regs [k1 ] for c in allowed_simply [k1 ]))
860
861
assert (all (c not in allowed_simply [k1 ] + allowed_regs [k1 ] for c in allowed_fpr [k1 ]))
861
862
assert (all (c not in allowed_simply [k1 ] + allowed_regs [k1 ] + allowed_fpr [k1 ] for c in forbidden_simple [k1 ]))
862
- assert (all (c in allowed_simply [k1 ] + allowed_regs [k1 ] + allowed_fpr [k1 ] + forbidden_simple [k1 ] for c in allowed_conv .values ))
863
+ assert (all (c in allowed_simply [k1 ] + allowed_regs [k1 ] + allowed_fpr [k1 ] + allowed_sextw [ k1 ] + forbidden_simple [k1 ] for c in allowed_conv .values ))
863
864
assert (all (c in allowed_conv .values for c in return_x87 ))
864
865
assert (all (c in forbidden_simple [k ] for c in depends_on_ld for k in forbidden_simple ))
865
866
@@ -872,6 +873,7 @@ def check_simple(v: FunctionType) -> Dict[str, int]:
872
873
for k in forbidden_simple :
873
874
regs_count : int = 0
874
875
fpr_count : int = 0
876
+ sextw_mask : int = 0
875
877
876
878
if v .get_convention () is not allowed_conv :
877
879
continue
@@ -884,13 +886,17 @@ def check_simple(v: FunctionType) -> Dict[str, int]:
884
886
fpr_count = fpr_count + 1
885
887
elif c in allowed_simply [k ]:
886
888
continue
889
+ elif c in allowed_sextw [k ]:
890
+ sextw_mask |= 1 << regs_count
891
+ regs_count += 1
887
892
else :
888
893
break
889
894
else :
890
895
# No character in forbidden_simply
891
896
if (regs_count <= 6 ) and (fpr_count <= 8 ):
892
897
# All checks passed!
893
898
ret_val = 1 + fpr_count
899
+ ret_val |= sextw_mask << 4
894
900
if v [0 ] in allowed_fpr [k ]:
895
901
ret_val = - ret_val
896
902
ret [k ] = ret_val
0 commit comments