vc3/asm/eval.h
2025-04-03 01:44:31 +02:00

58 lines
1.3 KiB
C

#pragma once
#include "common/arch.h"
#include "parse.h"
#include "resolve.h"
#include <stdbool.h>
#include <stdint.h>
typedef enum {
EoTy_Err,
EoTy_Reg,
EoTy_Imm,
EoTy_Str,
EoTy_Mem8Reg,
EoTy_Mem8Imm,
EoTy_MemU16Reg,
EoTy_MemU16Imm,
} EvaledOperandTy;
typedef struct {
EvaledOperandTy ty;
union {
Reg reg;
uint16_t imm;
};
uint16_t offset;
} EvaledOperand;
typedef struct {
const IdentResol* resol;
size_t extern_id;
uint16_t surrogate;
} SurrogateExternal;
typedef struct {
IdentResolver* re;
Reporter* rep;
bool second_pass;
uint16_t* used_imms;
size_t used_imms_size;
SurrogateExternal* externals;
size_t externals_size;
} OperandEvaluator;
void operand_evaluator_construct(
OperandEvaluator* evaluator, IdentResolver* re, Reporter* rep);
void operand_evaluator_destroy(OperandEvaluator* evaluator);
void operand_evaluator_reset_externals(OperandEvaluator* evaluator);
void operand_evaluator_use_imm(OperandEvaluator* evaluator, uint16_t imm);
EvaledOperand eval_operand_to_imm(
OperandEvaluator* evaluator, POperand* operand);
EvaledOperand eval_operand_indirection_expr(
OperandEvaluator* evaluator, POperand* operand);
EvaledOperand eval_operand(OperandEvaluator* evaluator, POperand* operand);