diff options
Diffstat (limited to 'tool/ruby_vm/models/operands_unifications.rb')
-rw-r--r-- | tool/ruby_vm/models/operands_unifications.rb | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/tool/ruby_vm/models/operands_unifications.rb b/tool/ruby_vm/models/operands_unifications.rb deleted file mode 100644 index c0ae0ece45..0000000000 --- a/tool/ruby_vm/models/operands_unifications.rb +++ /dev/null @@ -1,137 +0,0 @@ -#! /your/favourite/path/to/ruby -# -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*- -# -*- frozen_string_literal: true; -*- -# -*- warn_indent: true; -*- -# -# Copyright (c) 2017 Urabe, Shyouhei. All rights reserved. -# -# This file is a part of the programming language Ruby. Permission is hereby -# granted, to either redistribute and/or modify this file, provided that the -# conditions mentioned in the file COPYING are met. Consult the file for -# details. - -require_relative '../helpers/c_escape' -require_relative '../loaders/opt_operand_def' -require_relative 'bare_instructions' - -class RubyVM::OperandsUnifications < RubyVM::BareInstructions - include RubyVM::CEscape - - attr_reader :preamble, :original, :spec - - def initialize location:, signature: - name = signature[0] - @original = RubyVM::BareInstructions.fetch name - template = @original.template - parts = compose location, signature, template[:signature] - json = template.dup - json[:location] = location - json[:signature] = parts[:signature] - json[:name] = parts[:name] - @preamble = parts[:preamble] - @spec = parts[:spec] - super template: template, **json - parts[:vars].each do |v| - @variables[v[:name]] ||= v - end - end - - def operand_shift_of var - before = @original.opes.find_index var - after = @opes.find_index var - raise "no #{var} for #{@name}" unless before and after - return before - after - end - - def condition ptr - # :FIXME: I'm not sure if this method should be in model? - exprs = @spec.each_with_index.map do |(var, val), i| - case val when '*' then - next nil - else - type = @original.opes[i][:type] - expr = RubyVM::Typemap.typecast_to_VALUE type, val - next "#{ptr}[#{i}] == #{expr}" - end - end - exprs.compact! - if exprs.size == 1 then - return exprs[0] - else - exprs.map! {|i| "(#{i})" } - return exprs.join ' && ' - end - end - - private - - def namegen signature - insn, argv = *signature - wcary = argv.map do |i| - case i when '*' then - 'WC' - else - i - end - end - as_tr_cpp [insn, *wcary].join(', ') - end - - def compose location, spec, template - name = namegen spec - *, argv = *spec - opes = @original.opes - if opes.size != argv.size - raise sprintf("operand size mismatch for %s (%s's: %d, given: %d)", - name, template[:name], opes.size, argv.size) - else - src = [] - mod = [] - spec = [] - vars = [] - argv.each_index do |i| - j = argv[i] - k = opes[i] - spec[i] = [k, j] - case j when '*' then - # operand is from iseq - mod << k[:decl] - else - # operand is inside C - vars << k - src << { - location: location, - expr: " #{k[:name]} = #{j};" - } - end - end - src.map! {|i| RubyVM::CExpr.new i } - return { - name: name, - signature: { - name: name, - ope: mod, - pop: template[:pop], - ret: template[:ret], - }, - preamble: src, - vars: vars, - spec: spec - } - end - end - - @instances = RubyVM::OptOperandDef.map do |h| - new(**h) - end - - def self.to_a - @instances - end - - def self.each_group - to_a.group_by(&:original).each_pair do |k, v| - yield k, v - end - end -end |