You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
2.6 KiB
137 lines
2.6 KiB
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
args=("$@")
|
|
|
|
march=
|
|
mtriple=
|
|
extensions=
|
|
ignore_regex='^$'
|
|
includes=("./sections.yaml")
|
|
num_instrs=1000
|
|
|
|
usage() {
|
|
{
|
|
echo "isa-tests-gen.sh [options]"
|
|
echo " --march : Target architecture [required]"
|
|
echo " --mtriple : Target triple"
|
|
echo " --extensions : Target extensions string"
|
|
echo " --include : Additional include"
|
|
echo " --num-instrs : Number of instructions to generate (default: $num_instrs)"
|
|
echo " --ignore-opcode-regex : Regex to filter out opcodes"
|
|
echo " -h, --help : Print this help message"
|
|
} >&2
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--march)
|
|
shift
|
|
march=$1
|
|
shift
|
|
;;
|
|
--mtriple)
|
|
shift
|
|
mtriple=$1
|
|
shift
|
|
;;
|
|
--extensions)
|
|
shift
|
|
extensions="$1"
|
|
shift
|
|
;;
|
|
--include)
|
|
shift
|
|
includes+=("$1")
|
|
shift
|
|
;;
|
|
--num-instrs)
|
|
shift
|
|
num_instrs="$1"
|
|
shift
|
|
;;
|
|
--ignore-opcode-regex)
|
|
shift
|
|
ignore_regex="$1"
|
|
shift
|
|
;;
|
|
-h | --help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
declare -a ie_args
|
|
|
|
case $mtriple in
|
|
riscv32)
|
|
ie_args+=("-arch=riscv" "--rv32" "-riscv-ext" "$extensions")
|
|
;;
|
|
riscv64)
|
|
ie_args+=("-arch=riscv" "--rv64" "-riscv-ext" "$extensions")
|
|
;;
|
|
*)
|
|
echo "error: Unrecognized --mtriple" >&2
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
ie_args+=("--disable-pseudo")
|
|
|
|
if [[ -z "$march" ]]; then
|
|
echo "error: --march hasn't been specified" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! [ -x "$(command -v llvm-ie)" ]; then
|
|
echo "error: 'llvm-ie' is not in PATH" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mapfile -t opcodes < <(llvm-ie "${ie_args[@]}")
|
|
filtered_opcodes=()
|
|
|
|
for opc in "${opcodes[@]}"; do
|
|
if [[ ! "$opc" =~ $ignore_regex ]]; then
|
|
filtered_opcodes+=("$opc")
|
|
fi
|
|
done
|
|
|
|
if [[ ${#filtered_opcodes[@]} -eq 0 ]]; then
|
|
echo "error: No opcodes matched" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "# generated with" "$(basename "$0"), to regenerate run:"
|
|
printf "# %s" "$(basename "$0")"
|
|
for arg in "${args[@]}"; do
|
|
printf " %q" "$arg"
|
|
done
|
|
printf "\n"
|
|
echo "include:"
|
|
for inc in "${includes[@]}"; do
|
|
echo " - \"$inc\""
|
|
done
|
|
|
|
cat <<EOF
|
|
options:
|
|
march: ${march}
|
|
mtriple: ${mtriple}
|
|
num-instrs: ${num_instrs}
|
|
model-plugin: None
|
|
entry-point: SNIPPY_ENTRY
|
|
riscv-init-fregs-from-memory: true
|
|
histogram:
|
|
EOF
|
|
for opc in "${filtered_opcodes[@]}"; do
|
|
echo " - [$opc, 1.0]"
|
|
done
|
|
|
|
printf "\n"
|
|
|