Class: YTLJit::VM::Node::SendMultNode
- Includes:
- ArithmeticOperationUtil, SendUtil
- Defined in:
- lib/ytljit/vm_sendnode.rb
Constant Summary
Constants included from AbsArch
AbsArch::AL, AbsArch::BL, AbsArch::CL, AbsArch::DL, AbsArch::FUNC_ARG, AbsArch::FUNC_ARG_YTL, AbsArch::FUNC_FLOAT_ARG, AbsArch::FUNC_FLOAT_ARG_YTL, AbsArch::INDIRECT_BPR, AbsArch::INDIRECT_RETR, AbsArch::INDIRECT_SPR, AbsArch::INDIRECT_TMPR, AbsArch::INDIRECT_TMPR2, AbsArch::INDIRECT_TMPR3
Constants included from SSE
SSE::XMM0, SSE::XMM1, SSE::XMM2, SSE::XMM3, SSE::XMM4, SSE::XMM5, SSE::XMM6, SSE::XMM7
Constants inherited from BaseNode
Instance Attribute Summary
Attributes inherited from SendNode
#arguments, #class_top, #current_exception_table, #frame_info, #func, #modified_instance_var, #modified_local_var, #next_node, #opt_flag, #result_cache, #seq_no, #yield_signature_cache
Attributes included from HaveChildlenMixin
Attributes inherited from BaseNode
#code_space, #debug_info, #element_node_list, #id, #is_escape, #parent, #ti_observee, #ti_observer, #type
Instance Method Summary collapse
Methods included from SendUtil
#compile_c_fixarg, #compile_c_fixarg_raw, #compile_c_vararg, #compile_ytl, #gen_eval_self, #signature
Methods included from ArithmeticOperationUtil
#gen_arithmetic_operation, #gen_inst_with_conversion
Methods inherited from SendNode
add_special_send_node, #check_signature_changed, #collect_candidate_type, #collect_candidate_type_block, #collect_info, #fill_result_cache, #get_constant_value, get_macro_tab, #get_send_method_node, get_user_defined_method_tab, #inherit_from_callee, #initialize, macro_expand, make_send_node, node, #search_signature, #traverse_childlen, #traverse_node
Methods included from NodeUtil
#search_class_top, #search_end, #search_frame_info, #search_top
Methods included from SendNodeCodeGen
Methods included from CommonCodeGen
#dump_context, #gen_alloca, #gen_call, #gen_save_thepr
Methods included from OptFlagOp
#is_args_blockarg, #is_args_splat, #is_fcall, #is_opt_send, #is_super, #is_tailcall, #is_tailrecursion, #is_vcall
Methods included from HaveChildlenMixin
#initialize, #traverse_childlen
Methods inherited from BaseNode
#add_element_node, #add_element_node_backward, #add_element_node_backward_aux, #collect_candidate_type, #collect_info, #decide_type, #decide_type_core, #decide_type_once, #gen_type_inference_proc, #get_constant_value, #inference_type, #initialize, #marge_element_node, #marge_type, #same_type, #search_valid_signature, #set_escape_node, #set_escape_node_backward, #ti_add_observer, #ti_changed, #ti_del_link, #ti_reset, #ti_update
Methods included from TypeListWithSignature
#add_type, #set_type_list, #type_list, #type_list_initvar
Methods included from Inspect
Constructor Details
This class inherits a constructor from YTLJit::VM::Node::SendNode
Instance Method Details
#collect_candidate_type_regident(context, slf) ⇒ Object
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 |
# File 'lib/ytljit/vm_sendnode.rb', line 1049 def collect_candidate_type_regident(context, slf) cursig = context.to_signature case [slf.ruby_type] when [Fixnum], [Float] same_type(self, @arguments[2], cursig, cursig, context) same_type(self, @arguments[3], cursig, cursig, context) when [String] same_type(self, @arguments[2], cursig, cursig, context) fixtype = RubyType::BaseType.from_ruby_class(Fixnum) @arguments[3].add_type(context.to_signature, fixtype) when [Array] same_type(self, @arguments[2], cursig, cursig, context) fixtype = RubyType::BaseType.from_ruby_class(Fixnum) @arguments[3].add_type(context.to_signature, fixtype) end context end |
#compile(context) ⇒ Object
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 |
# File 'lib/ytljit/vm_sendnode.rb', line 1070 def compile(context) @type = nil rtype = decide_type_once(context.to_signature) rrtype = rtype.ruby_type if rtype.is_a?(RubyType::DefaultType0) or rrtype == String or rrtype == Array or @class_top.search_method_with_super(@func.name, rrtype)[0] then return super(context) end if rrtype == Fixnum then context = gen_arithmetic_operation(context, :imul, TMPR2, TMPR) do |context| asm = context.assembler if context.ret_reg.is_a?(OpRegistor) then asm.with_retry do asm.push(context.ret_reg) asm.mov(DBLLOR, TMPR2) asm.imul(INDIRECT_SPR) asm.add(SPR, AsmType::MACHINE_WORD.size) end elsif context.ret_reg.is_a?(OpImmidiateMachineWord) then asm.with_retry do asm.mov(TMPR, context.ret_reg) asm.push(TMPR) asm.mov(DBLLOR, TMPR2) asm.imul(INDIRECT_SPR) asm.add(SPR, AsmType::MACHINE_WORD.size) end else asm.with_retry do asm.mov(DBLLOR, TMPR2) asm.imul(context.ret_reg) end end context.end_using_reg(context.ret_reg) end elsif rrtype == Float then context = gen_arithmetic_operation(context, :mulsd, XMM4, XMM0) else raise "Unkown method #{rtype.ruby_type}##{@func.name}" end @body.compile(context) end |