зеркало из https://github.com/github/ruby.git
Port over setlocal and getglobal
This commit is contained in:
Родитель
8259813bc3
Коммит
8d2560f1f5
|
@ -1625,11 +1625,10 @@ fn gen_setlocal_wc0(
|
||||||
KeepCompiling
|
KeepCompiling
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
fn gen_setlocal_generic(
|
fn gen_setlocal_generic(
|
||||||
jit: &mut JITState,
|
jit: &mut JITState,
|
||||||
ctx: &mut Context,
|
ctx: &mut Context,
|
||||||
cb: &mut CodeBlock,
|
asm: &mut Assembler,
|
||||||
ocb: &mut OutlinedCb,
|
ocb: &mut OutlinedCb,
|
||||||
local_idx: i32,
|
local_idx: i32,
|
||||||
level: u32,
|
level: u32,
|
||||||
|
@ -1637,34 +1636,33 @@ fn gen_setlocal_generic(
|
||||||
let value_type = ctx.get_opnd_type(StackOpnd(0));
|
let value_type = ctx.get_opnd_type(StackOpnd(0));
|
||||||
|
|
||||||
// Load environment pointer EP at level
|
// Load environment pointer EP at level
|
||||||
gen_get_ep(cb, REG0, level);
|
let ep_opnd = gen_get_ep(asm, level);
|
||||||
|
|
||||||
// Write barriers may be required when VM_ENV_FLAG_WB_REQUIRED is set, however write barriers
|
// Write barriers may be required when VM_ENV_FLAG_WB_REQUIRED is set, however write barriers
|
||||||
// only affect heap objects being written. If we know an immediate value is being written we
|
// only affect heap objects being written. If we know an immediate value is being written we
|
||||||
// can skip this check.
|
// can skip this check.
|
||||||
if !value_type.is_imm() {
|
if !value_type.is_imm() {
|
||||||
// flags & VM_ENV_FLAG_WB_REQUIRED
|
// flags & VM_ENV_FLAG_WB_REQUIRED
|
||||||
let flags_opnd = mem_opnd(
|
let flags_opnd = Opnd::mem(
|
||||||
64,
|
64,
|
||||||
REG0,
|
ep_opnd,
|
||||||
SIZEOF_VALUE as i32 * VM_ENV_DATA_INDEX_FLAGS as i32,
|
SIZEOF_VALUE as i32 * VM_ENV_DATA_INDEX_FLAGS as i32,
|
||||||
);
|
);
|
||||||
test(cb, flags_opnd, uimm_opnd(VM_ENV_FLAG_WB_REQUIRED.into()));
|
asm.test(flags_opnd, VM_ENV_FLAG_WB_REQUIRED.into());
|
||||||
|
|
||||||
// Create a side-exit to fall back to the interpreter
|
// Create a side-exit to fall back to the interpreter
|
||||||
let side_exit = get_side_exit(jit, ocb, ctx);
|
let side_exit = get_side_exit(jit, ocb, ctx);
|
||||||
|
|
||||||
// if (flags & VM_ENV_FLAG_WB_REQUIRED) != 0
|
// if (flags & VM_ENV_FLAG_WB_REQUIRED) != 0
|
||||||
jnz_ptr(cb, side_exit);
|
asm.jnz(side_exit.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pop the value to write from the stack
|
// Pop the value to write from the stack
|
||||||
let stack_top = ctx.stack_pop(1);
|
let stack_top = ctx.stack_pop(1);
|
||||||
mov(cb, REG1, stack_top);
|
|
||||||
|
|
||||||
// Write the value at the environment pointer
|
// Write the value at the environment pointer
|
||||||
let offs = -(SIZEOF_VALUE as i32 * local_idx);
|
let offs = -(SIZEOF_VALUE as i32 * local_idx);
|
||||||
mov(cb, mem_opnd(64, REG0, offs), REG1);
|
asm.mov(Opnd::mem(64, ep_opnd, offs), stack_top);
|
||||||
|
|
||||||
KeepCompiling
|
KeepCompiling
|
||||||
}
|
}
|
||||||
|
@ -1672,24 +1670,23 @@ fn gen_setlocal_generic(
|
||||||
fn gen_setlocal(
|
fn gen_setlocal(
|
||||||
jit: &mut JITState,
|
jit: &mut JITState,
|
||||||
ctx: &mut Context,
|
ctx: &mut Context,
|
||||||
cb: &mut CodeBlock,
|
asm: &mut Assembler,
|
||||||
ocb: &mut OutlinedCb,
|
ocb: &mut OutlinedCb,
|
||||||
) -> CodegenStatus {
|
) -> CodegenStatus {
|
||||||
let idx = jit_get_arg(jit, 0).as_i32();
|
let idx = jit_get_arg(jit, 0).as_i32();
|
||||||
let level = jit_get_arg(jit, 1).as_u32();
|
let level = jit_get_arg(jit, 1).as_u32();
|
||||||
gen_setlocal_generic(jit, ctx, cb, ocb, idx, level)
|
gen_setlocal_generic(jit, ctx, asm, ocb, idx, level)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gen_setlocal_wc1(
|
fn gen_setlocal_wc1(
|
||||||
jit: &mut JITState,
|
jit: &mut JITState,
|
||||||
ctx: &mut Context,
|
ctx: &mut Context,
|
||||||
cb: &mut CodeBlock,
|
asm: &mut Assembler,
|
||||||
ocb: &mut OutlinedCb,
|
ocb: &mut OutlinedCb,
|
||||||
) -> CodegenStatus {
|
) -> CodegenStatus {
|
||||||
let idx = jit_get_arg(jit, 0).as_i32();
|
let idx = jit_get_arg(jit, 0).as_i32();
|
||||||
gen_setlocal_generic(jit, ctx, cb, ocb, idx, 1)
|
gen_setlocal_generic(jit, ctx, asm, ocb, idx, 1)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
// new hash initialized from top N values
|
// new hash initialized from top N values
|
||||||
fn gen_newhash(
|
fn gen_newhash(
|
||||||
|
@ -5290,28 +5287,29 @@ fn gen_leave(
|
||||||
EndBlock
|
EndBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
fn gen_getglobal(
|
fn gen_getglobal(
|
||||||
jit: &mut JITState,
|
jit: &mut JITState,
|
||||||
ctx: &mut Context,
|
ctx: &mut Context,
|
||||||
cb: &mut CodeBlock,
|
asm: &mut Assembler,
|
||||||
_ocb: &mut OutlinedCb,
|
_ocb: &mut OutlinedCb,
|
||||||
) -> CodegenStatus {
|
) -> CodegenStatus {
|
||||||
let gid = jit_get_arg(jit, 0);
|
let gid = jit_get_arg(jit, 0);
|
||||||
|
|
||||||
// Save the PC and SP because we might make a Ruby call for warning
|
// Save the PC and SP because we might make a Ruby call for warning
|
||||||
jit_prepare_routine_call(jit, ctx, cb, REG0);
|
jit_prepare_routine_call(jit, ctx, asm);
|
||||||
|
|
||||||
mov(cb, C_ARG_REGS[0], imm_opnd(gid.as_i64()));
|
let val_opnd = asm.ccall(
|
||||||
|
rb_gvar_get as *const u8,
|
||||||
call_ptr(cb, REG0, rb_gvar_get as *const u8);
|
vec![ gid.into() ]
|
||||||
|
);
|
||||||
|
|
||||||
let top = ctx.stack_push(Type::Unknown);
|
let top = ctx.stack_push(Type::Unknown);
|
||||||
mov(cb, top, RAX);
|
asm.mov(top, val_opnd);
|
||||||
|
|
||||||
KeepCompiling
|
KeepCompiling
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
fn gen_setglobal(
|
fn gen_setglobal(
|
||||||
jit: &mut JITState,
|
jit: &mut JITState,
|
||||||
ctx: &mut Context,
|
ctx: &mut Context,
|
||||||
|
@ -5974,9 +5972,9 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
|
||||||
YARVINSN_getlocal => Some(gen_getlocal),
|
YARVINSN_getlocal => Some(gen_getlocal),
|
||||||
YARVINSN_getlocal_WC_0 => Some(gen_getlocal_wc0),
|
YARVINSN_getlocal_WC_0 => Some(gen_getlocal_wc0),
|
||||||
YARVINSN_getlocal_WC_1 => Some(gen_getlocal_wc1),
|
YARVINSN_getlocal_WC_1 => Some(gen_getlocal_wc1),
|
||||||
//YARVINSN_setlocal => Some(gen_setlocal),
|
YARVINSN_setlocal => Some(gen_setlocal),
|
||||||
YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0),
|
YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0),
|
||||||
//YARVINSN_setlocal_WC_1 => Some(gen_setlocal_wc1),
|
YARVINSN_setlocal_WC_1 => Some(gen_setlocal_wc1),
|
||||||
YARVINSN_opt_plus => Some(gen_opt_plus),
|
YARVINSN_opt_plus => Some(gen_opt_plus),
|
||||||
/*
|
/*
|
||||||
YARVINSN_opt_minus => Some(gen_opt_minus),
|
YARVINSN_opt_minus => Some(gen_opt_minus),
|
||||||
|
@ -6040,8 +6038,8 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
|
||||||
//YARVINSN_invokesuper => Some(gen_invokesuper),
|
//YARVINSN_invokesuper => Some(gen_invokesuper),
|
||||||
YARVINSN_leave => Some(gen_leave),
|
YARVINSN_leave => Some(gen_leave),
|
||||||
|
|
||||||
/*
|
|
||||||
YARVINSN_getglobal => Some(gen_getglobal),
|
YARVINSN_getglobal => Some(gen_getglobal),
|
||||||
|
/*
|
||||||
YARVINSN_setglobal => Some(gen_setglobal),
|
YARVINSN_setglobal => Some(gen_setglobal),
|
||||||
YARVINSN_anytostring => Some(gen_anytostring),
|
YARVINSN_anytostring => Some(gen_anytostring),
|
||||||
YARVINSN_objtostring => Some(gen_objtostring),
|
YARVINSN_objtostring => Some(gen_objtostring),
|
||||||
|
|
Загрузка…
Ссылка в новой задаче