mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Implement topn instruction
This commit implements the topn instruction Co-Authored-By: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> Co-Authored-By: Noah Gibbs <noah.gibbs@shopify.com>
This commit is contained in:
parent
986b9b47d1
commit
9043ad3d74
2 changed files with 36 additions and 0 deletions
|
@ -1,3 +1,21 @@
|
|||
# Test for topn
|
||||
assert_equal 'array', %q{
|
||||
def threequals(a)
|
||||
case a
|
||||
when Array
|
||||
"array"
|
||||
when Hash
|
||||
"hash"
|
||||
else
|
||||
"unknown"
|
||||
end
|
||||
end
|
||||
|
||||
threequals([])
|
||||
threequals([])
|
||||
threequals([])
|
||||
}
|
||||
|
||||
# Test for opt_mod
|
||||
assert_equal '2', %q{
|
||||
def mod(a, b)
|
||||
|
|
|
@ -583,6 +583,23 @@ gen_setn(jitstate_t* jit, ctx_t* ctx)
|
|||
return YJIT_KEEP_COMPILING;
|
||||
}
|
||||
|
||||
// get nth stack value, then push it
|
||||
static codegen_status_t
|
||||
gen_topn(jitstate_t* jit, ctx_t* ctx)
|
||||
{
|
||||
int32_t n = (int32_t)jit_get_arg(jit, 0);
|
||||
|
||||
// Get top n type / operand
|
||||
val_type_t top_n_type = ctx_get_opnd_type(ctx, OPND_STACK(n));
|
||||
x86opnd_t top_n_val = ctx_stack_opnd(ctx, n);
|
||||
|
||||
x86opnd_t loc0 = ctx_stack_push(ctx, top_n_type);
|
||||
mov(cb, REG0, top_n_val);
|
||||
mov(cb, loc0, REG0);
|
||||
|
||||
return YJIT_KEEP_COMPILING;
|
||||
}
|
||||
|
||||
static codegen_status_t
|
||||
gen_pop(jitstate_t* jit, ctx_t* ctx)
|
||||
{
|
||||
|
@ -3191,6 +3208,7 @@ yjit_init_codegen(void)
|
|||
yjit_reg_op(BIN(dup), gen_dup);
|
||||
yjit_reg_op(BIN(dupn), gen_dupn);
|
||||
yjit_reg_op(BIN(setn), gen_setn);
|
||||
yjit_reg_op(BIN(topn), gen_topn);
|
||||
yjit_reg_op(BIN(pop), gen_pop);
|
||||
yjit_reg_op(BIN(adjuststack), gen_adjuststack);
|
||||
yjit_reg_op(BIN(newarray), gen_newarray);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue