58 lines
1.3 KiB
C
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);
|