aboutsummaryrefslogtreecommitdiff
path: root/tasm/src/bits.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-10-28 00:00:21 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-10-28 00:00:21 +0300
commitd96b8c7d12fc61ec609d6138627b9d6d18139a9a (patch)
tree82bc9a4c2b22de6c021097fb79a57b6d7756a127 /tasm/src/bits.c
downloadtri-d96b8c7d12fc61ec609d6138627b9d6d18139a9a.tar.gz
tri-d96b8c7d12fc61ec609d6138627b9d6d18139a9a.zip
move to monorepo
+ Will probably have to make some changes to dir layout to make things make more sense
Diffstat (limited to 'tasm/src/bits.c')
-rw-r--r--tasm/src/bits.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/tasm/src/bits.c b/tasm/src/bits.c
new file mode 100644
index 0000000..6397e2f
--- /dev/null
+++ b/tasm/src/bits.c
@@ -0,0 +1,75 @@
+#include <tasm/bits.h>
+
+tri_t parse_opcode(tri_t i)
+{
+ /* opcode is lowest five trits */
+ return tri_mask(i, 5);
+}
+
+tri_t build_r(tri_t opcode, tri_t rd, tri_t fn0, tri_t rs1, tri_t rs2, tri_t fn5)
+{
+ return opcode
+ | tri_sl(rd , 5)
+ | tri_sl(fn0, 9)
+ | tri_sl(rs1, 14)
+ | tri_sl(rs2, 18)
+ | tri_sl(fn5, 22);
+}
+
+void parse_r(tri_t i, tri_t *rd, tri_t *fn0, tri_t *rs1, tri_t *rs2, tri_t *fn5)
+{
+ *rd = tri_mask(tri_sr(i, 5), 4);
+ *fn0 = tri_mask(tri_sr(i, 9), 5);
+ *rs1 = tri_mask(tri_sr(i, 14), 4);
+ *rs2 = tri_mask(tri_sr(i, 18), 4);
+ *fn5 = tri_mask(tri_sr(i, 22), 5);
+}
+
+tri_t build_i(tri_t opcode, tri_t rd, tri_t fn0, tri_t rs1, tri_t imm9)
+{
+ return opcode
+ | tri_sl(rd , 5)
+ | tri_sl(fn0 , 9)
+ | tri_sl(rs1 , 14)
+ | tri_sl(imm9, 18);
+}
+
+void parse_i(tri_t i, tri_t *rd, tri_t *fn0, tri_t *rs1, tri_t *imm9)
+{
+ *rd = tri_mask(tri_sl(i, 5), 4);
+ *fn0 = tri_mask(tri_sl(i, 9), 5);
+ *rs1 = tri_mask(tri_sl(i, 14), 4);
+ *imm9 = tri_mask(tri_sl(i, 18), 9);
+}
+
+tri_t build_s(tri_t opcode, tri_t imm4, tri_t fn0, tri_t rs1, tri_t rs2, tri_t imm5)
+{
+ return opcode
+ | tri_sl(imm4, 5)
+ | tri_sl(fn0 , 9)
+ | tri_sl(rs1 , 14)
+ | tri_sl(rs2 , 18)
+ | tri_sl(imm5, 22);
+}
+
+void parse_s(tri_t i, tri_t *imm4, tri_t *fn0, tri_t *rs1, tri_t *rs2, tri_t *imm5)
+{
+ *imm4 = tri_mask(tri_sl(i, 5), 4);
+ *fn0 = tri_mask(tri_sl(i, 9), 5);
+ *rs1 = tri_mask(tri_sl(i, 14), 4);
+ *rs2 = tri_mask(tri_sl(i, 18), 4);
+ *imm5 = tri_mask(tri_sl(i, 22), 5);
+}
+
+tri_t build_u(tri_t opcode, tri_t rd, tri_t imm18)
+{
+ return opcode
+ | tri_sl(rd , 5)
+ | tri_sl(imm18, 9);
+}
+
+void parse_u(tri_t i, tri_t *rd, tri_t *imm18)
+{
+ *rd = tri_mask(tri_sl(i, 5), 4);
+ *imm18 = tri_mask(tri_sl(i, 9), 18);
+}