summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/sail.c35
-rw-r--r--lib/sail.h8
2 files changed, 43 insertions, 0 deletions
diff --git a/lib/sail.c b/lib/sail.c
index 28f318fa..24ff1fd2 100644
--- a/lib/sail.c
+++ b/lib/sail.c
@@ -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;
+}
diff --git a/lib/sail.h b/lib/sail.h
index 56df9740..49a5cf72 100644
--- a/lib/sail.h
+++ b/lib/sail.h
@@ -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);