Commit graph

274 commits

Author SHA1 Message Date
John Hawthorn
7d99e85601 Check for comptime fixnum in gen_fixnum_cmp 2021-10-20 18:19:40 -04:00
John Hawthorn
f1b7568f5a Check for comptime fixnums in opt_and and opt_or 2021-10-20 18:19:40 -04:00
John Hawthorn
cb9bc13fcb Check for comptime integers in opt_plus and opt_minus 2021-10-20 18:19:40 -04:00
John Hawthorn
fd10634b1a Move forward declaration up 2021-10-20 18:19:40 -04:00
Maxime Chevalier-Boisvert
bd8cfb351b Fix misplaced ivar_set_method exit counter 2021-10-20 18:19:40 -04:00
John Hawthorn
96fd8afbf4 Skip opt_case_dispatch 2021-10-20 18:19:40 -04:00
John Hawthorn
fc13ff14a2 Add comments to getspecial 2021-10-20 18:19:40 -04:00
Aaron Patterson
25f8431d46 only compile for T_OBJECT types 2021-10-20 18:19:40 -04:00
Aaron Patterson
5bc0343261 Refactor attrset to use a function
This new function will do the write barrier / resize the object / check
frozen for us
2021-10-20 18:19:40 -04:00
John Hawthorn
5092d6129a Fix opt_eq for overridden equality 2021-10-20 18:19:40 -04:00
John Hawthorn
44214e8ad9 Implement getspecial 2021-10-20 18:19:40 -04:00
Alan Wu
cbb0271dd6 Deduplicate side exits
Send instructions currently generate the exact same side exit twice.
Cache the exit the first time we generate it. Also add a comment
explaining what side exits do.

Closes GH-117.
2021-10-20 18:19:40 -04:00
Maxime Chevalier-Boisvert
11599e5e1e Add rb_darray_clear() for Kevin. Fix some warnings. 2021-10-20 18:19:40 -04:00
Aaron Patterson
f380856923 Add fixes for feedback 2021-10-20 18:19:40 -04:00
John Hawthorn
f30f299060 Use C_ARG_REGS earlier 2021-10-20 18:19:40 -04:00
John Hawthorn
9ebcd576f3 String and fixnum equality 2021-10-20 18:19:40 -04:00
John Hawthorn
6db5e80dd7 Use method dispatch for opt_eq 2021-10-20 18:19:40 -04:00
John Hawthorn
692f94ba0c Add jit_rb_obj_equal 2021-10-20 18:19:40 -04:00
Aaron Patterson
640b162b51 Exit when the object is frozen
Exit when the object is frozen, also add tests
2021-10-20 18:19:39 -04:00
Aaron Patterson
376f5ec1a1 Add a write barrier to ivar set
We need to fire the write barrier during ivar set.  This function
extracts the write barrier function then calls it.

Co-Authored-By: John Hawthorn <john@hawthorn.email>
2021-10-20 18:19:39 -04:00
eileencodes
307a4369e1 Implement setivar method calls 2021-10-20 18:19:39 -04:00
John Hawthorn
ce02aefabb Allow calling variadic cfuncs with many args
We have a check to ensure we don't have to push args on the stack to
call a cfunc with many args. However we never need to use the stack for
variadic cfuncs, so we shouldn't care about the number of arguments.
2021-10-20 18:19:39 -04:00
John Hawthorn
922aed92b5 Add codegen for rb_true and rb_false
These are used by .nil? and therefore opt_nil_p
2021-10-20 18:19:39 -04:00
John Hawthorn
fd34c831f6 Allow special case of expandarray with nil 2021-10-20 18:19:39 -04:00
Alan Wu
d098c5560b Shave a few instructions off of leave
The code path for leave that returns to the interpreter
(gen_leave() -> yjit_gen_leave_exit()) used to have the logic:

```
    cfp->sp++;
    cfp->sp[-1] = return_val;
    cfp->sp--;
    return return_val;
```

The SP changes it made was unnecessary and this change removes it.

After this change, `leave` doesn't adjust the `cfp->sp` of the caller
and only writes `cfp->sp[0]`. To accomodate this in the JIT-to-JIT
return case, return stubs have an `sp_offset` of 1.

The change removes sp adjustment from the JIT-to-JIT return case, too,
making it more efficient. Also, since the C method case of `send`
has an `sp_offset` of 1 after the call, this change enables block
version sharing.
2021-10-20 18:19:39 -04:00
Alan Wu
ed85e8a33a Use reg1 in GEN_COUNTER_INC to avoid clobbering RAX 2021-10-20 18:19:39 -04:00
John Hawthorn
c210fade27 Implement newrange 2021-10-20 18:19:39 -04:00
John Hawthorn
3ecc6befcd Implement invokesuper using cfp->ep[ME] check
This fixes and re-enables invokesuper, replacing the existing guards
with a guard on the method entry for the EP.
2021-10-20 18:19:39 -04:00
John Hawthorn
e527912fe0 Use jit_prepare_routine_call 2021-10-20 18:19:39 -04:00
John Hawthorn
69a2531249 Implement gen_putstring 2021-10-20 18:19:39 -04:00
Alan Wu
2bd99d7d7a typo, rename, comment 2021-10-20 18:19:39 -04:00
John Hawthorn
812597676b Avoid immediate side exits in checktype
Previously checktype only supported heap objects, however it's not
uncommon to receive an immediate, for example when string interpolating
a Symbol or Integer.
2021-10-20 18:19:39 -04:00
Alan Wu
54db64f7a5 filter out internal events. add comments. reorder 2021-10-20 18:19:39 -04:00
Alan Wu
4b815abb37 Lock, don't loock. 2021-10-20 18:19:39 -04:00
Alan Wu
bd876c243a TracePoint support
This change fixes some cases where YJIT fails to fire tracing events.
Most of the situations YJIT did not handle correctly involves enabling
tracing while running inside generated code.

A new operation to invalidate all generated code is added, which uses
patching to make generated code exit at the next VM instruction
boundary. A new routine called `jit_prepare_routine_call()` is
introduced to facilitate this and should be used when generating code
that could allocate, or could otherwise use `RB_VM_LOCK_ENTER()`.

The `c_return` event is fired in the middle of an instruction as opposed
to at an instruction boundary, so it requires special handling. C method
call return points are patched to go to a fucntion which does everything
the interpreter does, including firing the `c_return` event. The
generated code for C method calls normally does not fire the event.

Invalided code should not change after patching so the exits are not
clobbered. A new variable is introduced to track the region of code that
should not change.
2021-10-20 18:19:39 -04:00
Maxime Chevalier-Boisvert
0562459473 Redo the ivtable lookp once the ivar is set 2021-10-20 18:19:39 -04:00
Maxime Chevalier-Boisvert
b3e993a64b Make sure that there is always an index table entry for getivars 2021-10-20 18:19:39 -04:00
Jean Boussier
0dc3bba6f2 Allow to compile with --yjit-stats support but not the full RUBY_DEBUG
RUBY_DEBUG have a very significant performance overhead. Enough that
YJIT with RUBY_DEBUG is noticeably slower than the interpreter without
RUBY_DEBUG.

This makes it hard to collect yjit-stats in production environments.

By allowing to collect JIT statistics without the RUBy_DEBUG overhead,
I hope to make such use cases smoother.
2021-10-20 18:19:39 -04:00
eileencodes
2ba090a1f9 Add toregexp to yjit
The FIXME is there so we remember to investigate why insns clears the
temporary array. Is this necessary? If it's not we can remove it from
both.

Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
2021-10-20 18:19:39 -04:00
Maxime Chevalier-Boisvert
dd5082d7ca Use cmov to handle Qundef case in getivar instead of side-exit 2021-10-20 18:19:39 -04:00
Maxime Chevalier-Boisvert
c4b99d6a42 Add ASM comment 2021-10-20 18:19:39 -04:00
John Hawthorn
e18b0b6eba Implement putspecialobject 2021-10-20 18:19:39 -04:00
John Hawthorn
3edf29668e Add opt_regexpmatch2 2021-10-20 18:19:39 -04:00
John Hawthorn
595fdf8d66 Assign directly to C_ARG_REGS now when possible 2021-10-20 18:19:39 -04:00
John Hawthorn
8fa0ee4d40 Use callee-saved regs for REG_SP, REG_EP, REG_CFP 2021-10-20 18:19:39 -04:00
John Hawthorn
48dca3348a Move yjit_type_of_value into yjit_core.c 2021-10-20 18:19:38 -04:00
John Hawthorn
d78ea4abec Implement verify_ctx for debugging 2021-10-20 18:19:38 -04:00
John Hawthorn
a02002dc4f More detection of immediate constants 2021-10-20 18:19:38 -04:00
eileencodes
d2e8b99b5b Implement tostring instruction for yjit
Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
2021-10-20 18:19:38 -04:00
John Hawthorn
6c80150d40 Introduce ctx_{get,set}_opnd_mapping 2021-10-20 18:19:38 -04:00