#pragma once #include "common/arch.h" #include "parse.h" #include "resolve.h" #include #include 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);