diff options
| author | Alasdair | 2019-03-05 03:09:16 +0000 |
|---|---|---|
| committer | Alasdair | 2019-03-05 03:09:16 +0000 |
| commit | 8718a39778d4c673ceea1c7f9bb219b29788ebae (patch) | |
| tree | bb1bbb4a90fa1332e6c6736e99177934ca0dfdab /lib | |
| parent | 15872b4c48d932a920ea6d22b69889ff32f6a446 (diff) | |
Additional optimizations for C compilation
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sail.c | 59 | ||||
| -rw-r--r-- | lib/sail.h | 9 |
2 files changed, 67 insertions, 1 deletions
@@ -680,6 +680,11 @@ void zero_extend(lbits *rop, const lbits op, const sail_int len) mpz_set(*rop->bits, *op.bits); } +fbits fast_zero_extend(const sbits op, const uint64_t n) +{ + return op.bits; +} + void sign_extend(lbits *rop, const lbits op, const sail_int len) { assert(op.len <= mpz_get_ui(len)); @@ -694,6 +699,32 @@ void sign_extend(lbits *rop, const lbits op, const sail_int len) } } +fbits fast_sign_extend(const fbits op, const uint64_t n, const uint64_t m) +{ + uint64_t rop = op; + if (op & (UINT64_C(1) << (n - 1))) { + for (uint64_t i = m - 1; i >= n; i--) { + rop = rop | (UINT64_C(1) << i); + } + return rop; + } else { + return rop; + } +} + +fbits fast_sign_extend2(const sbits op, const uint64_t m) +{ + uint64_t rop = op.bits; + if (op.bits & (UINT64_C(1) << (op.len - 1))) { + for (uint64_t i = m - 1; i >= op.len; i--) { + rop = rop | (UINT64_C(1) << i); + } + return rop; + } else { + return rop; + } +} + void length_lbits(sail_int *rop, const lbits op) { mpz_set_ui(*rop, op.len); @@ -783,12 +814,21 @@ void sail_signed(sail_int *rop, const lbits op) } } -inline mach_int fast_unsigned(const fbits op) { return (mach_int) op; } +mach_int fast_signed(const fbits op, const uint64_t n) +{ + if (op & (UINT64_C(1) << (n - 1))) { + uint64_t rop = op & ~(UINT64_C(1) << (n - 1)); + return (mach_int) (rop - (UINT64_C(1) << (n - 1))); + } else { + return (mach_int) op; + } +} + void append(lbits *rop, const lbits op1, const lbits op2) { rop->len = op1.len + op2.len; @@ -911,6 +951,23 @@ void vector_update_subrange_lbits(lbits *rop, } } +fbits fast_update_subrange(const fbits op, + const mach_int n, + const mach_int m, + const fbits slice) +{ + fbits rop = op; + for (mach_int i = 0; i < n - (m - UINT64_C(1)); i++) { + uint64_t bit = UINT64_C(1) << ((uint64_t) i); + if (slice & bit) { + rop |= (bit << m); + } else { + rop &= ~(bit << m); + } + } + return rop; +} + void slice(lbits *rop, const lbits op, const sail_int start_mpz, const sail_int len_mpz) { assert(mpz_get_ui(start_mpz) + mpz_get_ui(len_mpz) <= op.len); @@ -246,7 +246,10 @@ void mult_vec(lbits *rop, const lbits op1, const lbits op2); void zeros(lbits *rop, const sail_int op); void zero_extend(lbits *rop, const lbits op, const sail_int len); +fbits fast_zero_extend(const sbits op, const uint64_t n); void sign_extend(lbits *rop, const lbits op, const sail_int len); +fbits fast_sign_extend(const fbits op, const uint64_t n, const uint64_t m); +fbits fast_sign_extend2(const sbits op, const uint64_t m); void length_lbits(sail_int *rop, const lbits op); @@ -267,6 +270,7 @@ fbits bitvector_access(const lbits op, const sail_int n_mpz); void sail_unsigned(sail_int *rop, const lbits op); void sail_signed(sail_int *rop, const lbits op); +mach_int fast_signed(const fbits, const uint64_t); mach_int fast_unsigned(const fbits); void append(lbits *rop, const lbits op1, const lbits op2); @@ -292,6 +296,11 @@ void vector_update_subrange_lbits(lbits *rop, const sail_int m_mpz, const lbits slice); +fbits fast_update_subrange(const fbits op, + const mach_int n, + const mach_int m, + const fbits slice); + void slice(lbits *rop, const lbits op, const sail_int start_mpz, const sail_int len_mpz); sbits sslice(const fbits op, const mach_int start, const mach_int len); |
