Skip to content

Commit 60f50c0

Browse files
authored
Merge pull request ruby#77 from Shopify/new_backend
Draft of IR for new backend
2 parents 59c9814 + 6abc4e1 commit 60f50c0

File tree

8 files changed

+636
-1
lines changed

8 files changed

+636
-1
lines changed

common.mk

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ COMMONOBJS = array.$(OBJEXT) \
151151
vm_sync.$(OBJEXT) \
152152
vm_trace.$(OBJEXT) \
153153
yjit_asm.$(OBJEXT) \
154+
yjit_backend.$(OBJEXT) \
154155
yjit_utils.$(OBJEXT) \
155156
yjit_core.$(OBJEXT) \
156157
yjit_codegen.$(OBJEXT) \
@@ -16442,6 +16443,169 @@ vm_trace.$(OBJEXT): {$(VPATH)}vm_trace.c
1644216443
vm_trace.$(OBJEXT): {$(VPATH)}yjit.h
1644316444
yjit_asm.$(OBJEXT): {$(VPATH)}yjit_asm.c
1644416445
yjit_asm.$(OBJEXT): {$(VPATH)}yjit_asm.h
16446+
yjit_backend.$(OBJEXT): $(hdrdir)/ruby/ruby.h
16447+
yjit_backend.$(OBJEXT): $(top_srcdir)/internal/static_assert.h
16448+
yjit_backend.$(OBJEXT): {$(VPATH)}assert.h
16449+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/assume.h
16450+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/attributes.h
16451+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/bool.h
16452+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/gcc_version_since.h
16453+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/inttypes.h
16454+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/limits.h
16455+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/long_long.h
16456+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
16457+
yjit_backend.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
16458+
yjit_backend.$(OBJEXT): {$(VPATH)}config.h
16459+
yjit_backend.$(OBJEXT): {$(VPATH)}darray.h
16460+
yjit_backend.$(OBJEXT): {$(VPATH)}defines.h
16461+
yjit_backend.$(OBJEXT): {$(VPATH)}intern.h
16462+
yjit_backend.$(OBJEXT): {$(VPATH)}internal.h
16463+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/anyargs.h
16464+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic.h
16465+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/char.h
16466+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/double.h
16467+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/fixnum.h
16468+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/gid_t.h
16469+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/int.h
16470+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/intptr_t.h
16471+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/long.h
16472+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/long_long.h
16473+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/mode_t.h
16474+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/off_t.h
16475+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/pid_t.h
16476+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/short.h
16477+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/size_t.h
16478+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/st_data_t.h
16479+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/arithmetic/uid_t.h
16480+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/assume.h
16481+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/alloc_size.h
16482+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/artificial.h
16483+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/cold.h
16484+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/const.h
16485+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/constexpr.h
16486+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/deprecated.h
16487+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/diagnose_if.h
16488+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/enum_extensibility.h
16489+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/error.h
16490+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/flag_enum.h
16491+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/forceinline.h
16492+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/format.h
16493+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/maybe_unused.h
16494+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/noalias.h
16495+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/nodiscard.h
16496+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/noexcept.h
16497+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/noinline.h
16498+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/nonnull.h
16499+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/noreturn.h
16500+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/pure.h
16501+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/restrict.h
16502+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/returns_nonnull.h
16503+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/warning.h
16504+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/attr/weakref.h
16505+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/cast.h
16506+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is.h
16507+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/apple.h
16508+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/clang.h
16509+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/gcc.h
16510+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/intel.h
16511+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/msvc.h
16512+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_is/sunpro.h
16513+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/compiler_since.h
16514+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/config.h
16515+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/constant_p.h
16516+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core.h
16517+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rarray.h
16518+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rbasic.h
16519+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rbignum.h
16520+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rclass.h
16521+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rdata.h
16522+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rfile.h
16523+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rhash.h
16524+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/robject.h
16525+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rregexp.h
16526+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rstring.h
16527+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rstruct.h
16528+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/core/rtypeddata.h
16529+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/ctype.h
16530+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/dllexport.h
16531+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/dosish.h
16532+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/error.h
16533+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/eval.h
16534+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/event.h
16535+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/fl_type.h
16536+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/gc.h
16537+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/glob.h
16538+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/globals.h
16539+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/attribute.h
16540+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/builtin.h
16541+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/c_attribute.h
16542+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/cpp_attribute.h
16543+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/declspec_attribute.h
16544+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/extension.h
16545+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/feature.h
16546+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/has/warning.h
16547+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/array.h
16548+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/bignum.h
16549+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/class.h
16550+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/compar.h
16551+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/complex.h
16552+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/cont.h
16553+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/dir.h
16554+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/enum.h
16555+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/enumerator.h
16556+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/error.h
16557+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/eval.h
16558+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/file.h
16559+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/gc.h
16560+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/hash.h
16561+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/io.h
16562+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/load.h
16563+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/marshal.h
16564+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/numeric.h
16565+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/object.h
16566+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/parse.h
16567+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/proc.h
16568+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/process.h
16569+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/random.h
16570+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/range.h
16571+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/rational.h
16572+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/re.h
16573+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/ruby.h
16574+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/select.h
16575+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/select/largesize.h
16576+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/signal.h
16577+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/sprintf.h
16578+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/string.h
16579+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/struct.h
16580+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/thread.h
16581+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/time.h
16582+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/variable.h
16583+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/intern/vm.h
16584+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/interpreter.h
16585+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/iterator.h
16586+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/memory.h
16587+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/method.h
16588+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/module.h
16589+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/newobj.h
16590+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/rgengc.h
16591+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/scan_args.h
16592+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/special_consts.h
16593+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/static_assert.h
16594+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/stdalign.h
16595+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/stdbool.h
16596+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/symbol.h
16597+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/value.h
16598+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/value_type.h
16599+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/variable.h
16600+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/warning_push.h
16601+
yjit_backend.$(OBJEXT): {$(VPATH)}internal/xmalloc.h
16602+
yjit_backend.$(OBJEXT): {$(VPATH)}missing.h
16603+
yjit_backend.$(OBJEXT): {$(VPATH)}st.h
16604+
yjit_backend.$(OBJEXT): {$(VPATH)}subst.h
16605+
yjit_backend.$(OBJEXT): {$(VPATH)}yjit_asm.h
16606+
yjit_backend.$(OBJEXT): {$(VPATH)}yjit_backend.c
16607+
yjit_backend.$(OBJEXT): {$(VPATH)}yjit_backend.h
16608+
yjit_backend.$(OBJEXT): {$(VPATH)}yjit_utils.h
1644516609
yjit_codegen.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
1644616610
yjit_codegen.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
1644716611
yjit_codegen.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -17029,6 +17193,7 @@ yjit_core.$(OBJEXT): {$(VPATH)}vm_opts.h
1702917193
yjit_core.$(OBJEXT): {$(VPATH)}vm_sync.h
1703017194
yjit_core.$(OBJEXT): {$(VPATH)}yjit.h
1703117195
yjit_core.$(OBJEXT): {$(VPATH)}yjit_asm.h
17196+
yjit_core.$(OBJEXT): {$(VPATH)}yjit_backend.h
1703217197
yjit_core.$(OBJEXT): {$(VPATH)}yjit_codegen.h
1703317198
yjit_core.$(OBJEXT): {$(VPATH)}yjit_core.c
1703417199
yjit_core.$(OBJEXT): {$(VPATH)}yjit_core.h

ruby.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,9 @@ setup_yjit_options(const char *s, struct rb_yjit_options *yjit_opt)
10511051
else if (opt_match_noarg(s, l, "stats")) {
10521052
yjit_opt->gen_stats = true;
10531053
}
1054+
else if (opt_match_noarg(s, l, "test-backend")) {
1055+
yjit_opt->test_backend = true;
1056+
}
10541057
else {
10551058
rb_raise(rb_eRuntimeError,
10561059
"invalid yjit option `%s' (--help will show valid yjit options)", s);

yjit.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ struct rb_yjit_options {
5151

5252
// Capture and print out stats
5353
bool gen_stats;
54+
55+
// Run backend tests
56+
bool test_backend;
5457
};
5558

5659
RUBY_SYMBOL_EXPORT_BEGIN

yjit_asm.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ static const x86opnd_t R15B = { OPND_REG, 8, .as.reg = { REG_GP, 15 }};
227227
#define NUM_C_ARG_REGS 6
228228
#define C_ARG_REGS ( (x86opnd_t[]){ RDI, RSI, RDX, RCX, R8, R9 } )
229229

230+
// Compute the number of bits needed to store a signed or unsigned value
231+
uint32_t sig_imm_size(int64_t imm);
232+
uint32_t unsig_imm_size(uint64_t imm);
233+
230234
// Memory operand with base register and displacement/offset
231235
x86opnd_t mem_opnd(uint32_t num_bits, x86opnd_t base_reg, int32_t disp);
232236

0 commit comments

Comments
 (0)