diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-10-29 13:16:25 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-10-29 13:16:25 +0200 |
| commit | 80d78c5589d42f81b04e671b28c103a2112458d1 (patch) | |
| tree | 81390d685648d25dd05dfa0092deb0587821cf5a /core/bits.c | |
| parent | b7525c84619f7bc28bcd3c43aa119d1c6bc23b6d (diff) | |
| download | tri-80d78c5589d42f81b04e671b28c103a2112458d1.tar.gz tri-80d78c5589d42f81b04e671b28c103a2112458d1.zip | |
move common stuff to core
+ Might have to come up with a better name, but works for now
Diffstat (limited to 'core/bits.c')
| -rw-r--r-- | core/bits.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/core/bits.c b/core/bits.c new file mode 100644 index 0000000..cfe0f20 --- /dev/null +++ b/core/bits.c @@ -0,0 +1,75 @@ +#include <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_sr(i, 5), 4); + *fn0 = tri_mask(tri_sr(i, 9), 5); + *rs1 = tri_mask(tri_sr(i, 14), 4); + *imm9 = tri_mask(tri_sr(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_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); + *imm5 = tri_mask(tri_sr(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_sr(i, 5), 4); + *imm18 = tri_mask(tri_sr(i, 9), 18); +} |
