This commit is contained in:
Maxime Chevalier-Boisvert 2021-04-06 12:00:09 -04:00 коммит произвёл Alan Wu
Родитель ad5cc39dcf
Коммит e98d2c5ec8
2 изменённых файлов: 22 добавлений и 2 удалений

Просмотреть файл

@ -70,6 +70,25 @@ ctx_stack_push_self(ctx_t* ctx)
return mem_opnd(64, REG_SP, offset);
}
/*
Push a local variable on the stack
*/
x86opnd_t
ctx_stack_push_local(ctx_t* ctx, size_t local_idx)
{
// Keep track of the type of the value
if (ctx->stack_size < MAX_TEMP_TYPES && local_idx < MAX_LOCAL_TYPES) {
ctx->temp_mapping[ctx->stack_size] = (temp_mapping_t){ .kind = TEMP_LOCAL, .idx = local_idx };
}
ctx->stack_size += 1;
ctx->sp_offset += 1;
// SP points just above the topmost value
int32_t offset = (ctx->sp_offset - 1) * sizeof(VALUE);
return mem_opnd(64, REG_SP, offset);
}
/*
Pop N values off the stack
Return a pointer to the stack top before the pop operation

Просмотреть файл

@ -73,8 +73,8 @@ typedef enum yjit_temp_loc
{
TEMP_STACK = 0,
TEMP_SELF,
//TEMP_LOCAL, // Local with index
//TEMP_CONST, // Small constant (0, 1, 2, Qnil, Qfalse, Qtrue)
TEMP_LOCAL, // Local with index
//TEMP_CONST, // Small constant (0, 1, 2, Qnil, Qfalse, Qtrue)
} temp_loc_t;
@ -218,6 +218,7 @@ typedef struct yjit_block_version
x86opnd_t ctx_sp_opnd(ctx_t* ctx, int32_t offset_bytes);
x86opnd_t ctx_stack_push(ctx_t* ctx, val_type_t type);
x86opnd_t ctx_stack_push_self(ctx_t* ctx);
x86opnd_t ctx_stack_push_local(ctx_t* ctx, size_t local_idx);
x86opnd_t ctx_stack_pop(ctx_t* ctx, size_t n);
x86opnd_t ctx_stack_opnd(ctx_t* ctx, int32_t idx);
val_type_t ctx_get_temp_type(const ctx_t* ctx, size_t idx);