#ifndef TSL_BYTECODE_H #define TSL_BYTECODE_H #include "std/buffer.h" #include typedef uint8_t TslOpcodeType; /* Registers are positive if they refer to local variables and negative when they refer to parameters */ typedef int16_t TslRegister; typedef uint16_t TslValueIndex; typedef enum { TSL_OPCODE_LOAD_NUMBER, TSL_OPCODE_MOV_REG } TslOpcode; typedef struct { TslBuffer buffer; TslRegister register_counter; } TslBytecodeWriter; typedef struct { TslRegister dst_reg; double number; TslOpcodeType opcode; } TslInstructionType1; typedef struct { TslRegister dst_reg; TslRegister src_reg; TslOpcodeType opcode; } TslInstructionType2; void tsl_bytecode_writer_init(TslBytecodeWriter *self); void tsl_bytecode_writer_deinit(TslBytecodeWriter *self); void tsl_bytecode_writer_reset_register_counter(TslBytecodeWriter *self); /* Returns -1 on error (too many registers used (more than 2^15)) */ TslRegister tsl_bytecode_writer_get_unique_register(TslBytecodeWriter *self); int tsl_bytecode_writer_load_number(TslBytecodeWriter *self, TslRegister dst, double number); int tsl_bytecode_writer_mov_reg(TslBytecodeWriter *self, TslRegister dst, TslRegister src); #endif /* TSL_BYTECODE_H */