/* Emit jit instructions to set the current sourceline and sourcefile. */ static VALUE function_set_ruby_source(VALUE self, VALUE node_v) { #ifndef RUBY_VM NODE * n; jit_function_t function; Data_Get_Struct(self, struct _jit_function, function); Data_Get_Struct(node_v, NODE, n); // TODO: type check VALUE value_objects = (VALUE)jit_function_get_meta(function, RJT_VALUE_OBJECTS); jit_constant_t c; c.type = jit_type_int; c.un.int_value = nd_line(n); jit_value_t line = jit_value_create_constant(function, &c); c.type = jit_type_void_ptr; c.un.ptr_value = n->nd_file; jit_value_t file = jit_value_create_constant(function, &c); c.type = jit_type_void_ptr; c.un.ptr_value = n; jit_value_t node = jit_value_create_constant(function, &c); c.type = jit_type_void_ptr; c.un.ptr_value = &ruby_sourceline; jit_value_t ruby_sourceline_ptr = jit_value_create_constant(function, &c); c.type = jit_type_void_ptr; c.un.ptr_value = &ruby_sourcefile; jit_value_t ruby_sourcefile_ptr = jit_value_create_constant(function, &c); c.type = jit_type_void_ptr; c.un.ptr_value = &ruby_current_node; jit_value_t ruby_current_node_ptr = jit_value_create_constant(function, &c); jit_insn_store_relative(function, ruby_sourceline_ptr, 0, line); jit_insn_store_relative(function, ruby_sourcefile_ptr, 0, file); jit_insn_store_relative(function, ruby_current_node_ptr, 0, node); rb_ary_push(value_objects, node_v); #else /* TODO: Not sure what to do on 1.9 yet */ #endif return Qnil; }
static jit_value_t apply_opcode(jit_function_t func, const _jit_intrinsic_info_t *opcode_info, jit_type_t dest_type, jit_value_t value1, jit_value_t value2) { jit_constant_t const_result; int result = 0; const_result.type = dest_type; switch(opcode_info->signature) { case JIT_SIG_i_i: { result = apply_i_i (&const_result, value1, (jit_cf_i_i_func)opcode_info->intrinsic); } break; case JIT_SIG_i_ii: { result = apply_i_ii (&const_result, value1, value2, (jit_cf_i_ii_func)opcode_info->intrinsic); } break; case JIT_SIG_i_piii: { result = apply_i_piii (&const_result, value1, value2, (jit_cf_i_piii_func)opcode_info->intrinsic); } break; case JIT_SIG_i_iI: { result = apply_i_iI (&const_result, value1, value2, (jit_cf_i_iI_func)opcode_info->intrinsic); } break; case JIT_SIG_i_II: { result = apply_i_II (&const_result, value1, value2, (jit_cf_i_II_func)opcode_info->intrinsic); } break; case JIT_SIG_I_I: { result = apply_I_I (&const_result, value1, (jit_cf_I_I_func)opcode_info->intrinsic); } break; case JIT_SIG_I_II: { result = apply_I_II (&const_result, value1, value2, (jit_cf_I_II_func)opcode_info->intrinsic); } break; case JIT_SIG_i_pIII: { result = apply_i_pIII (&const_result, value1, value2, (jit_cf_i_pIII_func)opcode_info->intrinsic); } break; case JIT_SIG_l_l: { result = apply_l_l (&const_result, value1, (jit_cf_l_l_func)opcode_info->intrinsic); } break; case JIT_SIG_l_ll: { result = apply_l_ll (&const_result, value1, value2, (jit_cf_l_ll_func)opcode_info->intrinsic); } break; case JIT_SIG_i_plll: { result = apply_i_plll (&const_result, value1, value2, (jit_cf_i_plll_func)opcode_info->intrinsic); } break; case JIT_SIG_i_l: { result = apply_i_l (&const_result, value1, (jit_cf_i_l_func)opcode_info->intrinsic); } break; case JIT_SIG_i_ll: { result = apply_i_ll (&const_result, value1, value2, (jit_cf_i_ll_func)opcode_info->intrinsic); } break; case JIT_SIG_l_lI: { result = apply_l_lI (&const_result, value1, value2, (jit_cf_l_lI_func)opcode_info->intrinsic); } break; case JIT_SIG_L_L: { result = apply_L_L (&const_result, value1, (jit_cf_L_L_func)opcode_info->intrinsic); } break; case JIT_SIG_L_LL: { result = apply_L_LL (&const_result, value1, value2, (jit_cf_L_LL_func)opcode_info->intrinsic); } break; case JIT_SIG_i_pLLL: { result = apply_i_pLLL (&const_result, value1, value2, (jit_cf_i_pLLL_func)opcode_info->intrinsic); } break; case JIT_SIG_i_LL: { result = apply_i_LL (&const_result, value1, value2, (jit_cf_i_LL_func)opcode_info->intrinsic); } break; case JIT_SIG_L_LI: { result = apply_L_LI (&const_result, value1, value2, (jit_cf_L_LI_func)opcode_info->intrinsic); } break; case JIT_SIG_f_f: { result = apply_f_f (&const_result, value1, (jit_cf_f_f_func)opcode_info->intrinsic); } break; case JIT_SIG_f_ff: { result = apply_f_ff (&const_result, value1, value2, (jit_cf_f_ff_func)opcode_info->intrinsic); } break; case JIT_SIG_i_f: { result = apply_i_f (&const_result, value1, (jit_cf_i_f_func)opcode_info->intrinsic); } break; case JIT_SIG_i_ff: { result = apply_i_ff (&const_result, value1, value2, (jit_cf_i_ff_func)opcode_info->intrinsic); } break; case JIT_SIG_d_d: { result = apply_d_d (&const_result, value1, (jit_cf_d_d_func)opcode_info->intrinsic); } break; case JIT_SIG_d_dd: { result = apply_d_dd (&const_result, value1, value2, (jit_cf_d_dd_func)opcode_info->intrinsic); } break; case JIT_SIG_i_d: { result = apply_i_d (&const_result, value1, (jit_cf_i_d_func)opcode_info->intrinsic); } break; case JIT_SIG_i_dd: { result = apply_i_dd (&const_result, value1, value2, (jit_cf_i_dd_func)opcode_info->intrinsic); } break; case JIT_SIG_D_D: { result = apply_D_D (&const_result, value1, (jit_cf_D_D_func)opcode_info->intrinsic); } break; case JIT_SIG_D_DD: { result = apply_D_DD (&const_result, value1, value2, (jit_cf_D_DD_func)opcode_info->intrinsic); } break; case JIT_SIG_i_D: { result = apply_i_D (&const_result, value1, (jit_cf_i_D_func)opcode_info->intrinsic); } break; case JIT_SIG_i_DD: { result = apply_i_DD (&const_result, value1, value2, (jit_cf_i_DD_func)opcode_info->intrinsic); } break; case JIT_SIG_conv: { result = apply_conv(&const_result, value1, 0); } break; case JIT_SIG_conv_ovf: { result = apply_conv(&const_result, value1, 1); } break; } if(result) { return jit_value_create_constant(func, &const_result); } return 0; }
jit_value jit_function::new_constant(const jit_constant_t& value) { value_wrap(jit_value_create_constant(func, &value)); }