The Ruby Programming Language [mirror]
Go to file
Kevin Newton 35cfc9a3bb
Remove as many unnecessary moves as possible (#6342)
This commit does a bunch of stuff to try to eliminate as many
unnecessary mov instructions as possible.

First, it introduces the Insn::LoadInto instruction. Previously
when we needed a value to go into a specific register (like in
Insn::CCall when we're putting values into the argument registers
or in Insn::CRet when we're putting a value into the return
register) we would first load the value and then mov it into the
correct register. This resulted in a lot of duplicated work with
short live ranges since they basically immediately we unnecessary.
The new instruction accepts a destination and does not interact
with the register allocator at all, making it much more efficient.

We then use the new instruction when we're loading values into
argument registers for AArch64 or X86_64, and when we're returning
a value from AArch64. Notably we don't do it when we're returning
a value from X86_64 because everything can be accomplished with a
single mov anyway.

A couple of unnecessary movs were also present because when we
called the split_load_opnd function in a lot of split passes we
were loading all registers and instruction outputs. We no longer do
that.

This commit also makes it so that UImm(0) passes through the
Insn::Store split without attempting to be loaded, which allows it
can take advantage of the zero register. So now instead of mov-ing
0 into a register and then calling store, it just stores XZR.
2022-09-08 17:09:50 -04:00
.github Add mjit-bindgen workflow (#6327) 2022-09-05 01:06:37 -07:00
basictest
benchmark rb_str_concat_literals: use rb_str_buf_append 2022-09-08 15:02:21 +02:00
bin
bootstraptest omit random failure in bootstraptest with freebsd 2022-09-06 16:27:12 +09:00
ccan
coroutine
coverage
cygwin Make sources by BASERUBY if available instead of miniruby 2022-09-03 19:25:29 +09:00
defs Generate token ID indexes in id.def 2022-09-08 18:18:56 +09:00
doc [DOC] [Bug #17120] Fix match-reset `\K` 2022-09-05 19:36:21 +09:00
enc
ext No longer bundle external library sources 2022-09-09 01:33:53 +09:00
gems
include [Bug #5317] Use `rb_off_t` instead of `off_t` 2022-09-08 23:01:07 +09:00
internal
lib [ruby/forwardable] Freeze VERSION and FORWARDABLE_VERSION to improve Ractor-compliance 2022-09-08 14:31:42 +09:00
libexec
man
misc
missing
sample
spec [rubygems/rubygems] Fix unused variable warning 2022-09-08 20:44:35 +09:00
template Generate token ID indexes in id.def 2022-09-08 18:18:56 +09:00
test Resync Bundler & RubyGems 2022-09-08 11:25:03 +09:00
tool Process token IDs from id.def without id.h 2022-09-08 18:22:47 +09:00
wasm
win32 eliminate magic number 2022-09-09 00:45:56 +09:00
yjit Remove as many unnecessary moves as possible (#6342) 2022-09-08 17:09:50 -04:00
.appveyor.yml
.cirrus.yml
.dir-locals.el
.document
.editorconfig
.gdbinit
.git-blame-ignore-revs
.gitattributes
.gitignore Ruby MJIT (#6028) 2022-09-04 21:53:46 -07:00
.indent.pro
.rdoc_options
.rspec_parallel
.travis.yml
BSDL
CONTRIBUTING.md
COPYING
COPYING.ja
GPL
KNOWNBUGS.rb
LEGAL
NEWS.md Update default gems list at 2657d8efb9 [ci skip] 2022-09-06 01:42:25 +00:00
README.EXT
README.EXT.ja
README.ja.md
README.md
aclocal.m4
addr2line.c
addr2line.h
array.c
array.rb
ast.c
ast.rb
autogen.sh
bignum.c
builtin.c
builtin.h
class.c
common.mk Process token IDs from id.def without id.h 2022-09-08 18:22:47 +09:00
compar.c
compile.c
complex.c
configure.ac Define BOOTSTRAPRUBY from HAVE_BASERUBY 2022-09-07 14:33:25 +09:00
constant.h
cont.c
darray.h
debug.c
debug_counter.c
debug_counter.h
dir.c
dir.rb
dln.c
dln.h
dln_find.c
dmydln.c
dmyenc.c
dmyext.c
encindex.h
encoding.c
enum.c
enumerator.c
error.c
eval.c
eval_error.c
eval_intern.h
eval_jump.c
file.c [Bug #5317] Use `rb_off_t` instead of `off_t` 2022-09-08 23:01:07 +09:00
gc.c
gc.h
gc.rb
gem_prelude.rb
golf_prelude.rb
goruby.c
hash.c
hrtime.h
id_table.c
id_table.h
inits.c Ruby MJIT (#6028) 2022-09-04 21:53:46 -07:00
insns.def
internal.h
io.c [Bug #5317] Use `rb_off_t` instead of `off_t` 2022-09-08 23:01:07 +09:00
io.rb
io_buffer.c [Bug #5317] Use `rb_off_t` instead of `off_t` 2022-09-08 23:01:07 +09:00
iseq.c
iseq.h
kernel.rb
lex.c.blt
load.c
loadpath.c
localeinit.c
main.c
marshal.c `w_bigfixnum` is used only for large FIXNUM 2022-09-02 22:11:12 +09:00
marshal.rb
math.c
memory_view.c
method.h
mini_builtin.c
miniinit.c
mjit.c Fix typo 2022-09-07 14:26:58 +09:00
mjit.h Allow hooking a different method after --mjit=pause 2022-09-06 15:52:02 +09:00
mjit.rb
mjit_compiler.c Cache RubyVM::MJIT constants 2022-09-06 15:50:14 +09:00
mjit_compiler.h Ruby MJIT (#6028) 2022-09-04 21:53:46 -07:00
mjit_compiler.rb Add another method for debugging 2022-09-07 06:21:13 +09:00
mjit_unit.h
nilclass.rb
node.c
node.h
numeric.c
numeric.rb
object.c [DOC] non-positive `base` in `Kernel#Integer` and `String#to_i` 2022-09-08 11:52:16 +09:00
pack.c
pack.rb
parse.y
prelude.rb
probes.d
probes_helper.h
proc.c
process.c Call appropriate hooks on MJIT's fork 2022-09-04 18:22:25 -07:00
ractor.c
ractor.rb
ractor_core.h
random.c
range.c rb_int_range_last: properly handle non-exclusive range 2022-09-04 11:16:11 +02:00
rational.c
re.c
regcomp.c
regenc.c
regenc.h
regerror.c
regexec.c
regint.h
regparse.c
regparse.h
regsyntax.c
ruby-runner.c
ruby.c Ruby MJIT (#6028) 2022-09-04 21:53:46 -07:00
ruby_assert.h
ruby_atomic.h
rubystub.c
scheduler.c [Bug #5317] Use `rb_off_t` instead of `off_t` 2022-09-08 23:01:07 +09:00
signal.c
siphash.c
siphash.h
sparc.c
sprintf.c
st.c
strftime.c
string.c rb_str_concat_literals: use rb_str_buf_append 2022-09-08 15:02:21 +02:00
string.rb
struct.c
symbol.c
symbol.h
thread.c Exit status macros need sys/wait.h on FreeBSD 2022-09-07 00:04:28 +09:00
thread_none.c
thread_none.h
thread_pthread.c
thread_pthread.h
thread_sync.c
thread_sync.rb
thread_win32.c
thread_win32.h
time.c [DOC] Remove extra page-dir prefix to fix broken link 2022-09-03 23:26:07 +09:00
timev.h
timev.rb
trace_point.rb
transcode.c
transcode_data.h
transient_heap.c
transient_heap.h
util.c [Bug #18997] Don't define ruby_qsort when POSIX qsort_r is available 2022-09-08 17:37:37 +09:00
variable.c
variable.h
version.c
version.h * 2022-09-09 [ci skip] 2022-09-09 00:46:21 +09:00
vm.c Do not fork the process on --mjit-wait 2022-09-06 15:42:02 +09:00
vm_args.c
vm_backtrace.c
vm_callinfo.h
vm_core.h
vm_debug.h
vm_dump.c
vm_eval.c
vm_exec.c
vm_exec.h
vm_insnhelper.c vm_objtostring: skip method lookup for T_STRING receivers 2022-09-08 15:02:21 +02:00
vm_insnhelper.h
vm_method.c
vm_opts.h
vm_sync.c
vm_sync.h
vm_trace.c
vsnprintf.c
warning.rb
yjit.c
yjit.h
yjit.rb

README.md

Actions Status: MinGW Actions Status: MJIT Actions Status: Ubuntu Actions Status: Windows AppVeyor status Travis Status Cirrus Status

What is Ruby?

Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and serialized files, or manage system tasks. It is simple, straightforward, and extensible.

Features of Ruby

  • Simple Syntax
  • Normal Object-oriented Features (e.g. class, method calls)
  • Advanced Object-oriented Features (e.g. mix-in, singleton-method)
  • Operator Overloading
  • Exception Handling
  • Iterators and Closures
  • Garbage Collection
  • Dynamic Loading of Object Files (on some architectures)
  • Highly Portable (works on many Unix-like/POSIX compatible platforms as well as Windows, macOS, etc.) cf. https://github.com/ruby/ruby/blob/master/doc/maintainers.rdoc#label-Platform+Maintainers

How to get Ruby with Git

For a complete list of ways to install Ruby, including using third-party tools like rvm, see:

https://www.ruby-lang.org/en/downloads/

The mirror of the Ruby source tree can be checked out with the following command:

$ git clone https://github.com/ruby/ruby.git

There are some other branches under development. Try the following command to see the list of branches:

$ git ls-remote https://github.com/ruby/ruby.git

You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source) if you are a committer.

Ruby home page

https://www.ruby-lang.org/

Documentation

Mailing list

There is a mailing list to discuss Ruby. To subscribe to this list, please send the following phrase:

subscribe

in the mail body (not subject) to the address ruby-talk-request@ruby-lang.org.

Copying

See the file COPYING.

Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list or on websites like https://stackoverflow.com.

Bugs should be reported at https://bugs.ruby-lang.org. Read "Reporting Issues" for more information.

Contributing

See "Contributing to Ruby", which includes setup and build instructions.

The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

matz@ruby-lang.org