diff options
Diffstat (limited to 'ujit_core.h')
-rw-r--r-- | ujit_core.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/ujit_core.h b/ujit_core.h new file mode 100644 index 0000000000..ede28e7834 --- /dev/null +++ b/ujit_core.h @@ -0,0 +1,50 @@ +#ifndef UJIT_CORE_H +#define UJIT_CORE_H 1 + +#include "stddef.h" +#include "ujit_asm.h" + +// Register uJIT receives the CFP and EC into +#define REG_CFP RDI +#define REG_EC RSI + +// Register uJIT loads the SP into +#define REG_SP RDX + +// Scratch registers used by uJIT +#define REG0 RAX +#define REG1 RCX +#define REG0_32 EAX +#define REG1_32 ECX + +// Code generation context +typedef struct ctx_struct +{ + // Current PC + VALUE *pc; + + // Difference between the current stack pointer and actual stack top + int32_t stack_diff; + + // The iseq that owns the region that is compiling + const rb_iseq_t *iseq; + + // Index in the iseq of the opcode we are replacing + size_t start_idx; + + // The start of the generated code + uint8_t *code_ptr; + + // Whether we know self is a heap object + bool self_is_object; + +} ctx_t; + +int ctx_get_opcode(ctx_t *ctx); +VALUE ctx_get_arg(ctx_t* ctx, size_t arg_idx); +x86opnd_t ctx_sp_opnd(ctx_t* ctx, int32_t offset_bytes); +x86opnd_t ctx_stack_push(ctx_t* ctx, size_t n); +x86opnd_t ctx_stack_pop(ctx_t* ctx, size_t n); +x86opnd_t ctx_stack_opnd(ctx_t* ctx, int32_t idx); + +#endif // #ifndef UJIT_CORE_H |