required = []
reuse = []
+canonical_order = "mafdqlcbjtpvn"
+
+def arch_canonicalize(arch):
+ # TODO: Support Z, S, H, or X extensions.
+ # TODO: Support implied extensions, e.g. D implied F in latest spec.
+ # TODO: Support extension version.
+ new_arch = ""
+ if arch[:5] in ['rv32e', 'rv32i', 'rv64i']:
+ new_arch = arch[:5]
+ else:
+ raise Exception("Unexpected arch: `%d`" % arch[:5])
+
+ # Find any Z, S, H or X
+ long_ext_prefixes = ['z', 's', 'h', 'x']
+ long_ext_prefixes_idx = map(lambda x: arch.find(x), long_ext_prefixes)
+
+ # Filter out any non-existent index.
+ long_ext_prefixes_idx = list(filter(lambda x: x != -1, long_ext_prefixes_idx))
+ if long_ext_prefixes_idx:
+ first_long_ext_idx = min(long_ext_prefixes_idx)
+ long_exts = arch[first_long_ext_idx:]
+ std_exts = arch[5:first_long_ext_idx]
+ else:
+ long_exts = ""
+ std_exts = arch[5:]
+
+ # Put extensions in canonical order.
+ for ext in canonical_order:
+ if ext in std_exts:
+ new_arch += ext
+
+ # Concat rest of the multi-char extensions.
+ new_arch += long_exts
+ return new_arch
+
for cfg in sys.argv[1:]:
(arch, abi, extra, ext) = cfg.split('-')
arches[arch] = 1
extra = list(filter(None, extra.split(',')))
ext = list(filter(None, ext.split(',')))
alts = sum([[x] + [x + y for y in ext] for x in [arch] + extra], [])
+ # TODO: We should expand g to imadzifencei once we support newer spec.
alts = alts + [x.replace('imafd', 'g') for x in alts if 'imafd' in x]
+ alts = list(map(arch_canonicalize, alts))
for alt in alts[1:]:
arches[alt] = 1
reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi))