-/*
- * definitions and macros
- */
-#define sc_add(a, b) sc_calc((a), (b), SC_ADD)
-#define sc_sub(a, b) sc_calc((a), (b), SC_SUB)
-#define sc_neg(a) sc_calc((a), NULL, SC_NEG)
-#define sc_and(a, b) sc_calc((a), (b), SC_AND)
-#define sc_or(a, b) sc_calc((a), (b), SC_OR)
-#define sc_xor(a, b) sc_calc((a), (b), SC_XOR)
-#define sc_not(a) sc_calc((a), NULL, SC_NOT)
-#define sc_mul(a, b) sc_calc((a), (b), SC_MUL)
-#define sc_div(a, b) sc_calc((a), (b), SC_DIV)
-#define sc_mod(a, b) sc_calc((a), (b), SC_MOD)
-#define sc_shl(a, b, c, d) sc_bitcalc((a), (b), (c), (d), SC_SHL)
-#define sc_shr(a, b, c, d) sc_bitcalc((a), (b), (c), (d), SC_SHR)
-#define sc_shrs(a, b, c, d) sc_bitcalc((a), (b), (c), (d), SC_SHRS)
-#define sc_rot(a, b, c, d) sc_bitcalc((a), (b), (c), (d), SC_ROT)
+/**
+ * buffer = value1 - value2
+ */
+void sc_sub(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = -value
+ */
+void sc_neg(const void *value, void *buffer);
+
+/**
+ * buffer = value1 & value2
+ */
+void sc_and(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = value1 & ~value2
+ */
+void sc_andnot(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = value1 | value2
+ */
+void sc_or(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = value1 ^ value2
+ */
+void sc_xor(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = ~value
+ */
+void sc_not(const void *value, void *buffer);
+
+/**
+ * buffer = value1 * value2
+ */
+void sc_mul(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = value1 / value2
+ */
+void sc_div(const void *value1, const void *value2, void *buffer);
+
+/**
+ * buffer = value1 % value2
+ */
+void sc_mod(const void *value1, const void *value2, void *buffer);
+
+/**
+ * div_buffer = value1 / value2
+ * mod_buffer = value1 % value2
+ */
+void sc_divmod(const void *value1, const void *value2, void *div_buffer, void *mod_buffer);
+
+/**
+ * buffer = value1 << offset
+ */
+void sc_shlI(const void *val1, long shift_cnt, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = value1 << value2
+ */
+void sc_shl(const void *value1, const void *value2, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = value1 >>u offset
+ */
+void sc_shrI(const void *val1, long shift_cnt, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = value1 >>u value2
+ */
+void sc_shr(const void *value1, const void *value2, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = value1 >>s value2
+ */
+void sc_shrs(const void *value1, const void *value2, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = value1 <<left>> value2
+ */
+void sc_rotl(const void *value1, const void *value2, int bitsize, int sign, void *buffer);
+
+/**
+ * buffer = 0
+ */
+void sc_zero(void *buffer);