diff options
author | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-05-18 23:01:12 +0300 |
---|---|---|
committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-05-18 23:01:12 +0300 |
commit | f4083f86cabfa4b314ef6fb3e1f3df96e5dbd794 (patch) | |
tree | 094e97ae68aa3102b86d5d51dd99c38d968888ff /include | |
parent | 0e6bc60ceb3d2676fae166308668680a2f675d17 (diff) | |
download | berg-f4083f86cabfa4b314ef6fb3e1f3df96e5dbd794.tar.gz berg-f4083f86cabfa4b314ef6fb3e1f3df96e5dbd794.zip |
initial full matrix multiplication
Diffstat (limited to 'include')
-rw-r--r-- | include/berg/vm.h | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/include/berg/vm.h b/include/berg/vm.h index 0f87452..66a7f06 100644 --- a/include/berg/vm.h +++ b/include/berg/vm.h @@ -15,13 +15,22 @@ enum berg_envcall { enum berg_op { BERG_LABEL, - BERG_LD32, - BERG_ST32, + BERG_LDXR_I32, + BERG_STXR_32, BERG_CALL, BERG_RET, BERG_ECALL, BERG_MOVI, BERG_MOVR, + + BERG_ADDR, + BERG_ADDI, + BERG_LSHI, + + BERG_MULR, + + BERG_BGER, + BERG_JMP, }; const char *berg_op_str(enum berg_op op); @@ -55,6 +64,14 @@ struct berg_operand { struct berg_gpr gpr; }; +struct berg_reloc { + size_t r; +}; + +struct berg_label { + size_t l; +}; + static inline struct berg_operand berg_operand_gpr(struct berg_gpr gpr, enum berg_type type) { return (struct berg_operand){.type = type, .gpr = gpr}; @@ -99,6 +116,48 @@ long berg_movr(struct berg_func *f, struct berg_gpr ra, struct berg_gpr rb); +long berg_mulr(struct berg_func *f, + struct berg_gpr ra, + struct berg_gpr rb, + struct berg_gpr rc); + +long berg_addr(struct berg_func *f, + struct berg_gpr ra, + struct berg_gpr rb, + struct berg_gpr rc); + +long berg_stxr_32(struct berg_func *f, + struct berg_gpr rb, + struct berg_gpr rc, + struct berg_gpr rd); + +long berg_ldxr_i32(struct berg_func *f, + struct berg_gpr rb, + struct berg_gpr rc, + struct berg_gpr rd); + +long berg_addi(struct berg_func *f, + struct berg_gpr ra, + struct berg_gpr rb, + int64_t imm); + +long berg_lshi(struct berg_func *f, + struct berg_gpr ra, + struct berg_gpr rb, + int64_t imm); + +void berg_patch(struct berg_func *f, + struct berg_reloc r, + struct berg_label l); + +struct berg_reloc berg_bger(struct berg_func *f, + struct berg_gpr rb, + struct berg_gpr rc); + +struct berg_reloc berg_jmp(struct berg_func *f); + +struct berg_label berg_label(struct berg_func *f); + long berg_ret(struct berg_func *f); #endif /* BERG_VM_H */ |