Placeholder Paolo Savini closed merge request !78: [RISCV] Add CORE-V headers at OpenHW Group / backup-20260412 / corev-llvm-project

Placeholder Paolo Savini
2024-01-07T02:00:41Z

Add header files for all CORE-V extensions that have C builtin functions following D155647. The definitions of existing builtin functions are also adjusted accordingly.

Note that D155647 defines new C functions without prefix __builtin (see below, also refer to RISCV-C-API Specification#Intrinsic Functions), while this PR simply re-declares existing builtins.

static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
__riscv_rol_32(uint32_t __x, uint32_t __y) {
return __builtin_rotateleft32(__x, __y);
}

The header files are extracted from the specification with this script:

script

import re
from pathlib import Path
from textwrap import dedent

# identify target-independent builtin functions
NAME_TO_EXTENSION_MAP = dict(abs="alu")

with open("corev-builtin-spec.md", "rt") as file:
spec = file.read()
exts = dict()

# rely on "####" as an indication of a builtin
for f in re.finditer(r"#### `(.+)`", spec):
r = re.match(
r"\w+ __builtin_((?:riscv_cv_([^_]+))?\w+)\s*\(.+\)",
f[1],
)
if r is None:
print("Failed to parse:", f[1])
continue
name = r[1]
ext = NAME_TO_EXTENSION_MAP.get(name, r[2])
# print(name, ext)
exts.setdefault(ext, []).append(f[1])

include = Path("include")
include.mkdir(exist_ok=True)

for e, funcs in exts.items():
prologue = dedent(f"""\
#ifndef __RISCV_COREV_{e.upper()}_H
#define __RISCV_COREV_{e.upper()}_H

#include <stdint.h>

#if defined(__cplusplus)
extern "C" {{
#endif

#if defined(__riscv_xcv{e})
""")
epilogue = dedent(f"""\
#endif // defined(__riscv_xcv{e})

#if defined(__cplusplus)
}}
#endif

#endif // define __RISCV_COREV_{e.upper()}_H
""")
ext_header = include / f"riscv_corev_{e}.h"
with ext_header.open("wt") as file:
file.write(prologue)
for func in funcs:
# file.write(
# "\nstatic __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))\n"
# )
file.write(func)
file.write(";\n")
file.write(epilogue)

Fix #74. CC @MaryBennett, @PaoloS02.