asm: implement stub instruction emitter

This commit is contained in:
2024-12-15 19:30:14 +00:00
parent 8889e58cf2
commit 9e75e1f16f
3 changed files with 53 additions and 3 deletions

View File

@@ -0,0 +1,46 @@
#include "assembler.h"
#include <blue/core/hash.h>
#include <blue/object/dict.h>
#include <blue/object/number.h>
#include <blue/object/string.h>
#include <ivy/asm/bin.h>
#include <ivy/ident.h>
#include <ivy/selector.h>
#include <stdlib.h>
#include <string.h>
struct block_assembler_scope {
struct assembler_scope s_base;
};
static enum ivy_status init_scope(
struct ivy_assembler *as, struct assembler_scope *scope,
const ivy_assembler_attrib_table attrib)
{
struct ivy_bin_block header = {0};
header.b_index = b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_INDEX]);
assembler_write_data(as, &header, sizeof header);
struct block_assembler_scope *c
= (struct block_assembler_scope *)scope;
return IVY_OK;
}
static enum ivy_status put_instr(
struct ivy_assembler *as, struct assembler_scope *scope,
const struct ivy_instr *instr)
{
uint32_t op = 0xAABBCCDD;
b_i32 x = b_i32_htob(op);
assembler_write_data(as, &x, sizeof x);
return IVY_OK;
}
const struct assembler_scope_type block_scope_type = {
.s_scope_size = sizeof(struct block_assembler_scope),
.s_init_scope = init_scope,
.s_put_instr = put_instr,
};

View File

@@ -67,6 +67,7 @@ struct ivy_bin_class_table_entry {
struct ivy_bin_class {
b_i32 c_ident;
uint8_t c_reserved[12];
struct ivy_bin_class_table_entry c_table[];
};

View File

@@ -6,6 +6,7 @@
#include <ivy/asm/bin.h>
#include <ivy/ident.h>
#include <ivy/selector.h>
#include <ivy/asm/instr.h>
#include <stdlib.h>
#define HASH_SELF 0x2d19e518d40792b7
@@ -154,8 +155,10 @@ static enum index_base get_index_base(struct ivy_asm_token *tok)
}
}
static enum ivy_status write_instruction(struct block_parser_state *state)
static enum ivy_status write_instruction(struct ivy_asm_parser *p, struct block_parser_state *state)
{
struct ivy_instr instr = {0};
ivy_assembler_put_instr(p->p_assembler, &instr);
return IVY_OK;
}
@@ -234,7 +237,7 @@ static enum ivy_status push_reg_arg(
static enum ivy_status parse_linefeed(
struct ivy_asm_parser *ctx, struct ivy_asm_token *tok)
{
struct block_parser_state *state
struct block_parser_state *state
= (struct block_parser_state *)asm_parser_get_state(ctx);
switch (state->s_prev_component) {
@@ -244,7 +247,7 @@ static enum ivy_status parse_linefeed(
case INSTR_OPERAND:
case INSTR_OPERAND_INDEX_RIGHT:
state->s_prev_component = INSTR_NONE;
return write_instruction(state);
return write_instruction(ctx, state);
default:
return IVY_ERR_BAD_SYNTAX;
}