XLEN parameterization for simx

This commit is contained in:
Santosh Srivatsan
2022-02-03 15:19:31 -05:00
parent 54dd2cfe1d
commit 836c777680
191 changed files with 5520 additions and 32163 deletions

View File

@@ -3,7 +3,6 @@
#include <cstdint>
#include <algorithm>
#include <assert.h>
#include "xlen.h"
constexpr uint32_t count_leading_zeros(uint32_t value) {
return value ? __builtin_clz(value) : 32;
@@ -88,9 +87,11 @@ inline uint64_t sext(uint64_t word, uint32_t width) {
return ((word >> (width - 1)) & 0x1) ? (word | ~mask) : word;
}
// change:
// Move this to another file later
inline uint64_t nan_box(uint32_t word) {
uintf_t mask = uintf_t(0xffffffff00000000);
return word | mask;
}
inline __uint128_t sext(__uint128_t word, uint32_t width) {
assert(width > 1);
assert(width <= 64);
__uint128_t unity = 1;
__uint128_t mask = (unity << width) - 1;
return ((word >> (width - 1)) & 0x1) ? (word | ~mask) : word;
}

View File

@@ -1,5 +1,4 @@
#include "rvfloats.h"
#include "xlen.h"
#include <stdio.h>
extern "C" {
@@ -299,14 +298,7 @@ uint64_t rv_fle_d(uint64_t a, uint64_t b, uint32_t* fflags) {
return r;
}
uint32_t rv_feq_s(uint64_t a, uint64_t b, uint32_t* fflags) {
#if FLEN == 64
// Either a or b isn't NaN boxed
if ((a >> 32 != 0xffffffff) || (b >> 32 != 0xffffffff)) {
return 0;
}
#endif
uint32_t rv_feq_s(uint32_t a, uint32_t b, uint32_t* fflags) {
auto r = f32_eq(to_float32_t(a), to_float32_t(b));
if (fflags) { *fflags = get_fflags(); }
@@ -437,21 +429,7 @@ uint64_t rv_fclss_d(uint64_t a) {
return r;
}
uint32_t rv_fsgnj_s(uint64_t a, uint64_t b) {
#if FLEN == 64
// Both a and b aren't NaN boxed
if ((a >> 32 != 0xffffffff) && (b >> 32 != 0xffffffff)) {
return 0x7fc00000;
}
// a is NaN boxed but b isn't
if (b >> 32 != 0xffffffff)
return a;
// b is NaN boxed but a isn't
if(a >> 32 != 0xffffffff)
return 0xffc00000;
#endif
uint32_t rv_fsgnj_s(uint32_t a, uint32_t b) {
int sign = b & F32_SIGN;
int r = sign | (a & ~F32_SIGN);
@@ -467,23 +445,7 @@ uint64_t rv_fsgnj_d(uint64_t a, uint64_t b) {
return r;
}
uint32_t rv_fsgnjn_s(uint64_t a, uint64_t b) {
#if FLEN == 64
// Both a and b aren't NaN boxed
if ((a >> 32 != 0xffffffff) && (b >> 32 != 0xffffffff)) {
return 0x7fc00000;
}
// a is NaN boxed but b isn't
if (b >> 32 != 0xffffffff)
return a;
// b is NaN boxed but a isn't
if(a >> 32 != 0xffffffff)
return 0xffc00000;
#endif
printf("XLEN=%d, FLEN=%d\n", XLEN, FLEN);
uint32_t rv_fsgnjn_s(uint32_t a, uint32_t b) {
int sign = ~b & F32_SIGN;
int r = sign | (a & ~F32_SIGN);
@@ -499,21 +461,7 @@ uint64_t rv_fsgnjn_d(uint64_t a, uint64_t b) {
return r;
}
uint32_t rv_fsgnjx_s(uint64_t a, uint64_t b) {
#if FLEN == 64
// Both a and b aren't NaN boxed
if ((a >> 32 != 0xffffffff) && (b >> 32 != 0xffffffff)) {
return 0x7fc00000;
}
// a is NaN boxed but b isn't
if (b >> 32 != 0xffffffff)
return a;
// b is NaN boxed but a isn't
if(a >> 32 != 0xffffffff)
return 0xffc00000;
#endif
uint32_t rv_fsgnjx_s(uint32_t a, uint32_t b) {
int sign1 = a & F32_SIGN;
int sign2 = b & F32_SIGN;

View File

@@ -27,13 +27,14 @@ uint32_t rv_ltof_s(uint64_t a, uint32_t frm, uint32_t* fflags);
uint32_t rv_lutof_s(uint64_t a, uint32_t frm, uint32_t* fflags);
uint32_t rv_fclss_s(uint32_t a);
uint32_t rv_fsgnj_s(uint64_t a, uint64_t b);
uint32_t rv_fsgnjn_s(uint64_t a, uint64_t b);
uint32_t rv_fsgnjx_s(uint64_t a, uint64_t b);
uint32_t rv_fsgnj_s(uint32_t a, uint32_t b);
uint32_t rv_fsgnjn_s(uint32_t a, uint32_t b);
uint32_t rv_fsgnjx_s(uint32_t a, uint32_t b);
uint32_t rv_flt_s(uint32_t a, uint32_t b, uint32_t* fflags);
uint32_t rv_fle_s(uint32_t a, uint32_t b, uint32_t* fflags);
uint32_t rv_feq_s(uint64_t a, uint64_t b, uint32_t* fflags);
uint32_t rv_feq_s(uint32_t a, uint32_t b, uint32_t* fflags);
uint32_t rv_fmin_s(uint32_t a, uint32_t b, uint32_t* fflags);
uint32_t rv_fmax_s(uint32_t a, uint32_t b, uint32_t* fflags);