diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sail.c | 35 | ||||
| -rw-r--r-- | lib/sail.h | 8 |
2 files changed, 43 insertions, 0 deletions
@@ -778,6 +778,30 @@ void append(lbits *rop, const lbits op1, const lbits op2) mpz_ior(*rop->bits, *rop->bits, *op2.bits); } +sbits append_sf(const sbits op1, const fbits op2, const uint64_t len) +{ + sbits rop; + rop.bits = (op1.bits << len) | op2; + rop.len = op1.len + len; + return rop; +} + +sbits append_fs(const fbits op1, const uint64_t len, const sbits op2) +{ + sbits rop; + rop.bits = (op1 << op2.len) | op2.bits; + rop.len = len + op2.len; + return rop; +} + +sbits append_ss(const sbits op1, const sbits op2) +{ + sbits rop; + rop.bits = (op1.bits << op2.len) | op2.bits; + rop.len = op1.len + op2.len; + return rop; +} + void replicate_bits(lbits *rop, const lbits op1, const mpz_t op2) { uint64_t op2_ui = mpz_get_ui(op2); @@ -1398,3 +1422,14 @@ void get_time_ns(sail_int *rop, const unit u) mpz_mul_ui(*rop, *rop, 1000000000); mpz_add_ui(*rop, *rop, t.tv_nsec); } + +// ARM specific optimisations + +void arm_align(lbits *rop, const lbits x_bv, const sail_int y_mpz) { + uint64_t x = mpz_get_ui(*x_bv.bits); + uint64_t y = mpz_get_ui(y_mpz); + uint64_t z = y * (x / y); + mp_bitcnt_t n = x_bv.len; + mpz_set_ui(*rop->bits, safe_rshift(UINT64_MAX, 64l - (n - 1)) & z); + rop->len = n; +} @@ -264,6 +264,10 @@ mach_int fast_unsigned(const fbits); void append(lbits *rop, const lbits op1, const lbits op2); +sbits append_sf(const sbits, const fbits, const uint64_t); +sbits append_fs(const fbits, const uint64_t, const sbits); +sbits append_ss(const sbits, const sbits); + void replicate_bits(lbits *rop, const lbits op1, const sail_int op2); fbits fast_replicate_bits(const fbits shift, const fbits v, const mach_int times); @@ -384,3 +388,7 @@ unit sail_putchar(const sail_int op); /* ***** Misc ***** */ void get_time_ns(sail_int*, const unit); + +/* ***** ARM optimisations ***** */ + +void arm_align(lbits *, const lbits, const sail_int); |
