aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure4
-rw-r--r--riscv/processor.cc72
-rw-r--r--riscv/riscv.ac4
3 files changed, 46 insertions, 34 deletions
diff --git a/configure b/configure
index ee85537..c76f0e8 100755
--- a/configure
+++ b/configure
@@ -1362,7 +1362,7 @@ Optional Packages:
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-isa=RV64IMAFDC Sets the default RISC-V ISA
--with-priv=MSU Sets the default RISC-V privilege modes supported
- --with-varch=v128:e64:s128
+ --with-varch=vlen:128,elen:64,slen:128
Sets the default vector config
Some influential environment variables:
@@ -4791,7 +4791,7 @@ _ACEOF
else
cat >>confdefs.h <<_ACEOF
-#define DEFAULT_VARCH "v128:e64:s128"
+#define DEFAULT_VARCH "vlen:128,elen:64,slen:128"
_ACEOF
fi
diff --git a/riscv/processor.cc b/riscv/processor.cc
index 66901a0..89974b7 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -74,17 +74,27 @@ static void bad_varch_string(const char* varch, const char *message)
abort();
}
-static int parse_varch(std::string &str){
- int val = 0;
- if(!str.empty()){
- std::string sval = str.substr(1);
- val = std::stoi(sval);
- if ((val & (val - 1)) != 0) // val should be power of 2
- bad_varch_string(str.c_str(), "must be a power of 2");
- }else{
- bad_varch_string(str.c_str(), "must not be empty");
+static std::string get_string_token(std::string str, const char delimiter, size_t& pos)
+{
+ size_t _pos = pos;
+ while (pos < str.length() && str[pos] != delimiter) ++pos;
+ return str.substr(_pos, pos - _pos);
+}
+
+static int get_int_token(std::string str, const char delimiter, size_t& pos)
+{
+ size_t _pos = pos;
+ while (pos < str.length() && str[pos] != delimiter) {
+ if (!isdigit(str[pos]))
+ bad_varch_string(str.c_str(), "Unsupported value"); // An integer is expected
+ ++pos;
}
- return val;
+ return (pos == _pos) ? 0 : stoi(str.substr(_pos, pos - _pos));
+}
+
+static bool check_pow2(int val)
+{
+ return ((val & (val - 1))) == 0;
}
void processor_t::parse_varch_string(const char* s)
@@ -93,30 +103,32 @@ void processor_t::parse_varch_string(const char* s)
for (const char *r = s; *r; r++)
str += std::tolower(*r);
- std::string delimiter = ":";
-
size_t pos = 0;
+ size_t len = str.length();
int vlen = 0;
int elen = 0;
int slen = 0;
- std::string token;
- while (!str.empty() && token != str) {
- pos = str.find(delimiter);
- if (pos == std::string::npos){
- token = str;
- }else{
- token = str.substr(0, pos);
- }
- if (token[0] == 'v'){
- vlen = parse_varch(token);
- }else if (token[0] == 'e'){
- elen = parse_varch(token);
- }else if (token[0] == 's'){
- slen = parse_varch(token);
- }else{
- bad_varch_string(str.c_str(), "Unsupported token");
- }
- str.erase(0, pos + delimiter.length());
+
+ while (pos < len) {
+ std::string attr = get_string_token(str, ':', pos);
+
+ ++pos;
+
+ if (attr == "vlen")
+ vlen = get_int_token(str, ',', pos);
+ else if (attr == "slen")
+ slen = get_int_token(str, ',', pos);
+ else if (attr == "elen")
+ elen = get_int_token(str, ',', pos);
+ else
+ bad_varch_string(s, "Unsupported token");
+
+ ++pos;
+ }
+
+ // The integer should be the power of 2
+ if (!check_pow2(vlen) || !check_pow2(elen) || !check_pow2(slen)){
+ bad_varch_string(s, "The integer value should be the power of 2");
}
/* Vector spec requirements. */
diff --git a/riscv/riscv.ac b/riscv/riscv.ac
index fc45732..22d0d3a 100644
--- a/riscv/riscv.ac
+++ b/riscv/riscv.ac
@@ -13,10 +13,10 @@ AC_ARG_WITH(priv,
AC_DEFINE_UNQUOTED([DEFAULT_PRIV], "MSU", [Default value for --priv switch]))
AC_ARG_WITH(varch,
- [AS_HELP_STRING([--with-varch=v128:e64:s128],
+ [AS_HELP_STRING([--with-varch=vlen:128,elen:64,slen:128],
[Sets the default vector config])],
AC_DEFINE_UNQUOTED([DEFAULT_VARCH], "$withval", [Default value for --varch switch]),
- AC_DEFINE_UNQUOTED([DEFAULT_VARCH], "v128:e64:s128", [Default value for --varch switch]))
+ AC_DEFINE_UNQUOTED([DEFAULT_VARCH], "vlen:128,elen:64,slen:128", [Default value for --varch switch]))
AC_SEARCH_LIBS([dlopen], [dl dld], [], [