%]
+%option gen_intrinsic_table = yes
+%option intrinsic_table_decl = "_jit_intrinsic_info_t const _jit_intrinsics[JIT_OP_NUM_OPCODES]"
+
opcodes(JIT_OP_, "jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES]")
{
op_def("nop") { }
/*
* Conversion opcodes
*/
- op_def("trunc_sbyte") { op_values(int, int) }
- op_def("trunc_ubyte") { op_values(int, int) }
- op_def("trunc_short") { op_values(int, int) }
- op_def("trunc_ushort") { op_values(int, int) }
- op_def("trunc_int") { op_values(int, int) }
- op_def("trunc_uint") { op_values(int, int) }
+ op_def("trunc_sbyte") { op_values(int, int),
+ op_intrinsic(conv) }
+ op_def("trunc_ubyte") { op_values(int, int),
+ op_intrinsic(conv) }
+ op_def("trunc_short") { op_values(int, int),
+ op_intrinsic(conv) }
+ op_def("trunc_ushort") { op_values(int, int),
+ op_intrinsic(conv) }
+ op_def("trunc_int") { op_values(int, int),
+ op_intrinsic(conv) }
+ op_def("trunc_uint") { op_values(int, int),
+ op_intrinsic(conv) }
op_def("check_sbyte") { op_values(int, int) }
op_def("check_ubyte") { op_values(int, int) }
op_def("check_short") { op_values(int, int) }
op_def("check_ushort") { op_values(int, int) }
op_def("check_int") { op_values(int, int) }
op_def("check_uint") { op_values(int, int) }
- op_def("low_word") { op_values(int, long) }
- op_def("expand_int") { op_values(long, int) }
- op_def("expand_uint") { op_values(long, int) }
+ op_def("low_word") { op_values(int, long),
+ op_intrinsic(conv) }
+ op_def("expand_int") { op_values(long, int),
+ op_intrinsic(conv) }
+ op_def("expand_uint") { op_values(long, int),
+ op_intrinsic(conv) }
op_def("check_low_word") { op_values(int, long) }
op_def("check_signed_low_word") { op_values(int, long) }
op_def("check_long") { op_values(long, long) }
op_def("check_ulong") { op_values(long, long) }
- op_def("float32_to_int") { op_values(int, float32) }
- op_def("float32_to_uint") { op_values(int, float32) }
- op_def("float32_to_long") { op_values(long, float32) }
- op_def("float32_to_ulong") { op_values(long, float32) }
+ op_def("float32_to_int") { op_values(int, float32),
+ op_intrinsic(conv) }
+ op_def("float32_to_uint") { op_values(int, float32),
+ op_intrinsic(conv) }
+ op_def("float32_to_long") { op_values(long, float32),
+ op_intrinsic(conv) }
+ op_def("float32_to_ulong") { op_values(long, float32),
+ op_intrinsic(conv) }
op_def("check_float32_to_int") { op_values(int, float32) }
op_def("check_float32_to_uint") { op_values(int, float32) }
op_def("check_float32_to_long") { op_values(long, float32) }
op_def("check_float32_to_ulong") { op_values(long, float32) }
- op_def("int_to_float32") { op_values(float32, int) }
- op_def("uint_to_float32") { op_values(float32, int) }
- op_def("long_to_float32") { op_values(float32, long) }
- op_def("ulong_to_float32") { op_values(float32, long) }
- op_def("float32_to_float64") { op_values(float64, float32) }
- op_def("float64_to_int") { op_values(int, float64) }
- op_def("float64_to_uint") { op_values(int, float64) }
- op_def("float64_to_long") { op_values(long, float64) }
- op_def("float64_to_ulong") { op_values(long, float64) }
+ op_def("int_to_float32") { op_values(float32, int),
+ op_intrinsic(conv) }
+ op_def("uint_to_float32") { op_values(float32, int),
+ op_intrinsic(conv) }
+ op_def("long_to_float32") { op_values(float32, long),
+ op_intrinsic(conv) }
+ op_def("ulong_to_float32") { op_values(float32, long),
+ op_intrinsic(conv) }
+ op_def("float32_to_float64") { op_values(float64, float32),
+ op_intrinsic(conv) }
+ op_def("float64_to_int") { op_values(int, float64),
+ op_intrinsic(conv) }
+ op_def("float64_to_uint") { op_values(int, float64),
+ op_intrinsic(conv) }
+ op_def("float64_to_long") { op_values(long, float64),
+ op_intrinsic(conv) }
+ op_def("float64_to_ulong") { op_values(long, float64),
+ op_intrinsic(conv) }
op_def("check_float64_to_int") { op_values(int, float64) }
op_def("check_float64_to_uint") { op_values(int, float64) }
op_def("check_float64_to_long") { op_values(long, float64) }
op_def("check_float64_to_ulong") { op_values(long, float64) }
- op_def("int_to_float64") { op_values(float64, int) }
- op_def("uint_to_float64") { op_values(float64, int) }
- op_def("long_to_float64") { op_values(float64, long) }
- op_def("ulong_to_float64") { op_values(float64, long) }
- op_def("float64_to_float32") { op_values(float32, float64) }
- op_def("nfloat_to_int") { op_values(int, nfloat) }
- op_def("nfloat_to_uint") { op_values(int, nfloat) }
- op_def("nfloat_to_long") { op_values(long, nfloat) }
- op_def("nfloat_to_ulong") { op_values(long, nfloat) }
+ op_def("int_to_float64") { op_values(float64, int),
+ op_intrinsic(conv) }
+ op_def("uint_to_float64") { op_values(float64, int),
+ op_intrinsic(conv) }
+ op_def("long_to_float64") { op_values(float64, long),
+ op_intrinsic(conv) }
+ op_def("ulong_to_float64") { op_values(float64, long),
+ op_intrinsic(conv) }
+ op_def("float64_to_float32") { op_values(float32, float64),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_int") { op_values(int, nfloat),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_uint") { op_values(int, nfloat),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_long") { op_values(long, nfloat),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_ulong") { op_values(long, nfloat),
+ op_intrinsic(conv) }
op_def("check_nfloat_to_int") { op_values(int, nfloat) }
op_def("check_nfloat_to_uint") { op_values(int, nfloat) }
op_def("check_nfloat_to_long") { op_values(long, nfloat) }
op_def("check_nfloat_to_ulong") { op_values(long, nfloat) }
- op_def("int_to_nfloat") { op_values(nfloat, int) }
- op_def("uint_to_nfloat") { op_values(nfloat, int) }
- op_def("long_to_nfloat") { op_values(nfloat, long) }
- op_def("ulong_to_nfloat") { op_values(nfloat, long) }
- op_def("nfloat_to_float32") { op_values(float32, nfloat) }
- op_def("nfloat_to_float64") { op_values(float64, nfloat) }
- op_def("float32_to_nfloat") { op_values(nfloat, float32) }
- op_def("float64_to_nfloat") { op_values(nfloat, float64) }
+ op_def("int_to_nfloat") { op_values(nfloat, int),
+ op_intrinsic(conv) }
+ op_def("uint_to_nfloat") { op_values(nfloat, int),
+ op_intrinsic(conv) }
+ op_def("long_to_nfloat") { op_values(nfloat, long),
+ op_intrinsic(conv) }
+ op_def("ulong_to_nfloat") { op_values(nfloat, long),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_float32") { op_values(float32, nfloat),
+ op_intrinsic(conv) }
+ op_def("nfloat_to_float64") { op_values(float64, nfloat),
+ op_intrinsic(conv) }
+ op_def("float32_to_nfloat") { op_values(nfloat, float32),
+ op_intrinsic(conv) }
+ op_def("float64_to_nfloat") { op_values(nfloat, float64),
+ op_intrinsic(conv) }
/*
* Arithmetic opcodes.
*/
- op_def("iadd", +) { op_values(int, int, int) }
- op_def("iadd_ovf") { op_values(int, int, int) }
- op_def("iadd_ovf_un") { op_values(int, int, int) }
- op_def("isub", -) { op_values(int, int, int) }
- op_def("isub_ovf") { op_values(int, int, int) }
- op_def("isub_ovf_un") { op_values(int, int, int) }
- op_def("imul", *) { op_values(int, int, int) }
- op_def("imul_ovf") { op_values(int, int, int) }
- op_def("imul_ovf_un") { op_values(int, int, int) }
- op_def("idiv", /) { op_values(int, int, int) }
- op_def("idiv_un") { op_values(int, int, int) }
- op_def("irem", %) { op_values(int, int, int) }
- op_def("irem_un") { op_values(int, int, int) }
- op_def("ineg", neg) { op_values(int, int) }
- op_def("ladd", +) { op_values(long, long, long) }
- op_def("ladd_ovf") { op_values(long, long, long) }
- op_def("ladd_ovf_un") { op_values(long, long, long) }
- op_def("lsub", -) { op_values(long, long, long) }
- op_def("lsub_ovf") { op_values(long, long, long) }
- op_def("lsub_ovf_un") { op_values(long, long, long) }
- op_def("lmul", *) { op_values(long, long, long) }
- op_def("lmul_ovf") { op_values(long, long, long) }
- op_def("lmul_ovf_un") { op_values(long, long, long) }
- op_def("ldiv", /) { op_values(long, long, long) }
- op_def("ldiv_un") { op_values(long, long, long) }
- op_def("lrem", %) { op_values(long, long, long) }
- op_def("lrem_un") { op_values(long, long, long) }
- op_def("lneg", neg) { op_values(long, long) }
- op_def("fadd", +) { op_values(float32, float32, float32) }
- op_def("fsub", -) { op_values( float32, float32, float32) }
- op_def("fmul", *) { op_values(float32, float32, float32) }
- op_def("fdiv", /) { op_values(float32, float32, float32) }
- op_def("frem", %) { op_values(float32, float32, float32) }
- op_def("frem_ieee") { op_values(float32, float32, float32) }
- op_def("fneg", neg) { op_values(float32, float32) }
- op_def("dadd", +) { op_values(float64, float64, float64) }
- op_def("dsub", -) { op_values(float64, float64, float64) }
- op_def("dmul", *) { op_values(float64, float64, float64) }
- op_def("ddiv", /) { op_values(float64, float64, float64) }
- op_def("drem", %) { op_values(float64, float64, float64) }
- op_def("drem_ieee") { op_values(float64, float64, float64) }
- op_def("dneg", neg) { op_values(float64, float64) }
- op_def("nfadd", +) { op_values(nfloat, nfloat, nfloat) }
- op_def("nfsub", -) { op_values(nfloat, nfloat, nfloat) }
- op_def("nfmul", *) { op_values(nfloat, nfloat, nfloat) }
- op_def("nfdiv", /) { op_values(nfloat, nfloat, nfloat) }
- op_def("nfrem", %) { op_values(nfloat, nfloat, nfloat) }
- op_def("nfrem_ieee") { op_values(nfloat, nfloat, nfloat) }
- op_def("nfneg", neg) { op_values(nfloat, nfloat) }
+ op_def("iadd", +) { op_values(int, int, int),
+ op_intrinsic(jit_int_add, i_ii) }
+ op_def("iadd_ovf") { op_values(int, int, int),
+ op_intrinsic(jit_int_add_ovf, i_piii) }
+ op_def("iadd_ovf_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_add_ovf, i_pIII) }
+ op_def("isub", -) { op_values(int, int, int),
+ op_intrinsic(jit_int_sub, i_ii) }
+ op_def("isub_ovf") { op_values(int, int, int),
+ op_intrinsic(jit_int_sub_ovf, i_piii) }
+ op_def("isub_ovf_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_sub_ovf, i_pIII) }
+ op_def("imul", *) { op_values(int, int, int),
+ op_intrinsic(jit_int_mul, i_ii) }
+ op_def("imul_ovf") { op_values(int, int, int),
+ op_intrinsic(jit_int_mul_ovf, i_piii) }
+ op_def("imul_ovf_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_mul_ovf, i_pIII) }
+ op_def("idiv", /) { op_values(int, int, int),
+ op_intrinsic(jit_int_div, i_piii) }
+ op_def("idiv_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_div, i_pIII) }
+ op_def("irem", %) { op_values(int, int, int),
+ op_intrinsic(jit_int_rem, i_piii) }
+ op_def("irem_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_rem, i_pIII) }
+ op_def("ineg", neg) { op_values(int, int),
+ op_intrinsic(jit_int_neg, i_i) }
+ op_def("ladd", +) { op_values(long, long, long),
+ op_intrinsic(jit_long_add, l_ll) }
+ op_def("ladd_ovf") { op_values(long, long, long),
+ op_intrinsic(jit_long_add_ovf, i_plll) }
+ op_def("ladd_ovf_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_add_ovf, i_pLLL) }
+ op_def("lsub", -) { op_values(long, long, long),
+ op_intrinsic(jit_long_sub, l_ll) }
+ op_def("lsub_ovf") { op_values(long, long, long),
+ op_intrinsic(jit_long_sub_ovf, i_plll) }
+ op_def("lsub_ovf_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_sub_ovf, i_pLLL) }
+ op_def("lmul", *) { op_values(long, long, long),
+ op_intrinsic(jit_long_mul, l_ll) }
+ op_def("lmul_ovf") { op_values(long, long, long),
+ op_intrinsic(jit_long_mul_ovf, i_plll) }
+ op_def("lmul_ovf_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_mul_ovf, i_pLLL) }
+ op_def("ldiv", /) { op_values(long, long, long),
+ op_intrinsic(jit_long_div, i_plll) }
+ op_def("ldiv_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_div, i_pLLL) }
+ op_def("lrem", %) { op_values(long, long, long),
+ op_intrinsic(jit_long_rem, i_plll) }
+ op_def("lrem_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_rem, i_pLLL) }
+ op_def("lneg", neg) { op_values(long, long),
+ op_intrinsic(jit_long_neg, l_l) }
+ op_def("fadd", +) { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_add, f_ff) }
+ op_def("fsub", -) { op_values( float32, float32, float32),
+ op_intrinsic(jit_float32_sub, f_ff) }
+ op_def("fmul", *) { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_mul, f_ff) }
+ op_def("fdiv", /) { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_div, f_ff) }
+ op_def("frem", %) { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_rem, f_ff) }
+ op_def("frem_ieee") { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_ieee_rem, f_ff) }
+ op_def("fneg", neg) { op_values(float32, float32),
+ op_intrinsic(jit_float32_neg, f_f) }
+ op_def("dadd", +) { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_add, d_dd) }
+ op_def("dsub", -) { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_sub, d_dd) }
+ op_def("dmul", *) { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_mul, d_dd) }
+ op_def("ddiv", /) { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_div, d_dd) }
+ op_def("drem", %) { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_rem, d_dd) }
+ op_def("drem_ieee") { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_ieee_rem, d_dd) }
+ op_def("dneg", neg) { op_values(float64, float64),
+ op_intrinsic(jit_float64_neg, d_d) }
+ op_def("nfadd", +) { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_add, D_DD) }
+ op_def("nfsub", -) { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_sub, D_DD) }
+ op_def("nfmul", *) { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_mul, D_DD) }
+ op_def("nfdiv", /) { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_div, D_DD) }
+ op_def("nfrem", %) { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_rem, D_DD) }
+ op_def("nfrem_ieee") { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_ieee_rem, D_DD) }
+ op_def("nfneg", neg) { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_neg, D_D) }
/*
* Bitwise opcodes.
*/
- op_def("iand", &) { op_values(int, int, int) }
- op_def("ior", |) { op_values(int, int, int) }
- op_def("ixor", ^) { op_values(int, int, int) }
- op_def("inot", ~) { op_values(int, int) }
- op_def("ishl", <<) { op_values(int, int, int) }
- op_def("ishr", >>) { op_values(int, int, int) }
- op_def("ishr_un", shr_un) { op_values(int, int, int) }
- op_def("land", &) { op_values(long, long, long) }
- op_def("lor", |) { op_values(long, long, long) }
- op_def("lxor", ^) { op_values(long, long, long) }
- op_def("lnot", ~) { op_values(long, long) }
- op_def("lshl", <<) { op_values(long, long, int) }
- op_def("lshr", >>) { op_values(long, long, int) }
- op_def("lshr_un", shr_un) { op_values(long, long, int) }
+ op_def("iand", &) { op_values(int, int, int),
+ op_intrinsic(jit_int_and, i_ii) }
+ op_def("ior", |) { op_values(int, int, int),
+ op_intrinsic(jit_int_or, i_ii) }
+ op_def("ixor", ^) { op_values(int, int, int),
+ op_intrinsic(jit_int_xor, i_ii) }
+ op_def("inot", ~) { op_values(int, int),
+ op_intrinsic(jit_int_not, i_i) }
+ op_def("ishl", <<) { op_values(int, int, int),
+ op_intrinsic(jit_int_shl, i_iI) }
+ op_def("ishr", >>) { op_values(int, int, int),
+ op_intrinsic(jit_int_shr, i_iI) }
+ op_def("ishr_un", shr_un) { op_values(int, int, int),
+ op_intrinsic(jit_uint_shr, i_iI) }
+ op_def("land", &) { op_values(long, long, long),
+ op_intrinsic(jit_long_and, l_ll) }
+ op_def("lor", |) { op_values(long, long, long),
+ op_intrinsic(jit_long_or, l_ll) }
+ op_def("lxor", ^) { op_values(long, long, long),
+ op_intrinsic(jit_long_xor, l_ll) }
+ op_def("lnot", ~) { op_values(long, long),
+ op_intrinsic(jit_long_not, l_l) }
+ op_def("lshl", <<) { op_values(long, long, int),
+ op_intrinsic(jit_long_shl, l_lI) }
+ op_def("lshr", >>) { op_values(long, long, int),
+ op_intrinsic(jit_long_shr, l_lI) }
+ op_def("lshr_un", shr_un) { op_values(long, long, int),
+ op_intrinsic(jit_ulong_shr, L_LI) }
/*
* Branch opcodes.
*/
op_def("br") { op_type(branch) }
- op_def("br_ifalse") { op_type(branch), op_values(empty, int) }
- op_def("br_itrue") { op_type(branch), op_values(empty, int) }
- op_def("br_ieq", ==) { op_type(branch), op_values(empty, int, int) }
- op_def("br_ine", !=) { op_type(branch), op_values(empty, int, int) }
- op_def("br_ilt", <) { op_type(branch), op_values(empty, int, int) }
- op_def("br_ilt_un") { op_type(branch), op_values(empty, int, int) }
- op_def("br_ile", <=) { op_type(branch), op_values(empty, int, int) }
- op_def("br_ile_un") { op_type(branch), op_values(empty, int, int) }
- op_def("br_igt", >) { op_type(branch), op_values(empty, int, int) }
- op_def("br_igt_un") { op_type(branch), op_values(empty, int, int) }
- op_def("br_ige", >=) { op_type(branch), op_values(empty, int, int) }
- op_def("br_ige_un") { op_type(branch), op_values(empty, int, int) }
- op_def("br_lfalse") { op_type(branch), op_values(empty, long) }
- op_def("br_ltrue") { op_type(branch), op_values(empty, long) }
- op_def("br_leq", ==) { op_type(branch), op_values(empty, long, long) }
- op_def("br_lne", !=) { op_type(branch), op_values(empty, long, long) }
- op_def("br_llt", <) { op_type(branch), op_values(empty, long, long) }
- op_def("br_llt_un") { op_type(branch), op_values(empty, long, long) }
- op_def("br_lle", <=) { op_type(branch), op_values(empty, long, long) }
- op_def("br_lle_un") { op_type(branch), op_values(empty, long, long) }
- op_def("br_lgt", >) { op_type(branch), op_values(empty, long, long) }
- op_def("br_lgt_un") { op_type(branch), op_values(empty, long, long) }
- op_def("br_lge", >=) { op_type(branch), op_values(empty, long, long) }
- op_def("br_lge_un") { op_type(branch), op_values(empty, long, long) }
- op_def("br_feq", ==) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fne", !=) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_flt", <) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fle", <=) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fgt", >) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fge", >=) { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_flt_inv") { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fle_inv") { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fgt_inv") { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_fge_inv") { op_type(branch), op_values(empty, float32, float32) }
- op_def("br_deq", ==) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dne", !=) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dlt", <) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dle", <=) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dgt", >) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dge", >=) { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dlt_inv") { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dle_inv") { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dgt_inv") { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_dge_inv") { op_type(branch), op_values(empty, float64, float64) }
- op_def("br_nfeq", ==) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfne", !=) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nflt", <) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfle", <=) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfgt", >) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfge", >=) { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nflt_inv") { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfle_inv") { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfgt_inv") { op_type(branch), op_values(empty, nfloat, nfloat) }
- op_def("br_nfge_inv") { op_type(branch), op_values(empty, nfloat, nfloat) }
+ op_def("br_ifalse") { op_type(branch), op_values(empty, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH_UNARY | _JIT_INTRINSIC_FLAG_IFALSE") }
+ op_def("br_itrue") { op_type(branch), op_values(empty, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH_UNARY | _JIT_INTRINSIC_FLAG_ITRUE") }
+ op_def("br_ieq", ==) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_IEQ") }
+ op_def("br_ine", !=) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_INE") }
+ op_def("br_ilt", <) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_ILT") }
+ op_def("br_ilt_un") { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_ILT_UN") }
+ op_def("br_ile", <=) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_ILE") }
+ op_def("br_ile_un") { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_ILE_UN") }
+ op_def("br_igt", >) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_IGT") }
+ op_def("br_igt_un") { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_IGT_UN") }
+ op_def("br_ige", >=) { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_IGE") }
+ op_def("br_ige_un") { op_type(branch), op_values(empty, int, int),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_IGE_UN") }
+ op_def("br_lfalse") { op_type(branch), op_values(empty, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH_UNARY | _JIT_INTRINSIC_FLAG_LFALSE") }
+ op_def("br_ltrue") { op_type(branch), op_values(empty, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH_UNARY | _JIT_INTRINSIC_FLAG_LTRUE") }
+ op_def("br_leq", ==) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LEQ") }
+ op_def("br_lne", !=) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LNE") }
+ op_def("br_llt", <) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LLT") }
+ op_def("br_llt_un") { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LLT_UN") }
+ op_def("br_lle", <=) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LLE") }
+ op_def("br_lle_un") { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LLE_UN") }
+ op_def("br_lgt", >) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LGT") }
+ op_def("br_lgt_un") { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LGT_UN") }
+ op_def("br_lge", >=) { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LGE") }
+ op_def("br_lge_un") { op_type(branch), op_values(empty, long, long),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_LGE_UN") }
+ op_def("br_feq", ==) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FEQ") }
+ op_def("br_fne", !=) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FNE") }
+ op_def("br_flt", <) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FLT") }
+ op_def("br_fle", <=) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FLE") }
+ op_def("br_fgt", >) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FGT") }
+ op_def("br_fge", >=) { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FGE") }
+ op_def("br_flt_inv") { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FLT_INV") }
+ op_def("br_fle_inv") { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FLE_INV") }
+ op_def("br_fgt_inv") { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FGT_INV") }
+ op_def("br_fge_inv") { op_type(branch), op_values(empty, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_FGE_INV") }
+ op_def("br_deq", ==) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DEQ") }
+ op_def("br_dne", !=) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DNE") }
+ op_def("br_dlt", <) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DLT") }
+ op_def("br_dle", <=) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DLE") }
+ op_def("br_dgt", >) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DGT") }
+ op_def("br_dge", >=) { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DGE") }
+ op_def("br_dlt_inv") { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DLT_INV") }
+ op_def("br_dle_inv") { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DLE_INV") }
+ op_def("br_dgt_inv") { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DGT_INV") }
+ op_def("br_dge_inv") { op_type(branch), op_values(empty, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_DGE_INV") }
+ op_def("br_nfeq", ==) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFEQ") }
+ op_def("br_nfne", !=) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFNE") }
+ op_def("br_nflt", <) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFLT") }
+ op_def("br_nfle", <=) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFLE") }
+ op_def("br_nfgt", >) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFGT") }
+ op_def("br_nfge", >=) { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFGE") }
+ op_def("br_nflt_inv") { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFLT_INV") }
+ op_def("br_nfle_inv") { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFLE_INV") }
+ op_def("br_nfgt_inv") { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFGT_INV") }
+ op_def("br_nfge_inv") { op_type(branch), op_values(empty, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_BRANCH | JIT_OP_NFGE_INV") }
/*
* Comparison opcodes.
*/
- op_def("icmp") { op_values(int, int, int) }
- op_def("icmp_un") { op_values(int, int, int) }
- op_def("lcmp") { op_values(int, long, long) }
- op_def("lcmp_un") { op_values(int, long, long) }
- op_def("fcmpl") { op_values(int, float32, float32) }
- op_def("fcmpg") { op_values(int, float32, float32) }
- op_def("dcmpl") { op_values(int, float64, float64) }
- op_def("dcmpg") { op_values(int, float64, float64) }
- op_def("nfcmpl") { op_values(int, nfloat, nfloat) }
- op_def("nfcmpg") { op_values(int, nfloat, nfloat) }
- op_def("ieq", ==) { op_values(int, int, int) }
- op_def("ine", !=) { op_values(int, int, int) }
- op_def("ilt", <) { op_values(int, int, int) }
- op_def("ilt_un") { op_values(int, int, int) }
- op_def("ile", <=) { op_values(int, int, int) }
- op_def("ile_un") { op_values(int, int, int) }
- op_def("igt", >) { op_values(int, int, int) }
- op_def("igt_un") { op_values(int, int, int) }
- op_def("ige", >=) { op_values(int, int, int) }
- op_def("ige_un") { op_values(int, int, int) }
- op_def("leq", ==) { op_values(int, long, long) }
- op_def("lne", !=) { op_values(int, long, long) }
- op_def("llt", <) { op_values(int, long, long) }
- op_def("llt_un") { op_values(int, long, long) }
- op_def("lle", <=) { op_values(int, long, long) }
- op_def("lle_un") { op_values(int, long, long) }
- op_def("lgt", >) { op_values(int, long, long) }
- op_def("lgt_un") { op_values(int, long, long) }
- op_def("lge", >=) { op_values(int, long, long) }
- op_def("lge_un") { op_values(int, long, long) }
- op_def("feq", ==) { op_values(int, float32, float32) }
- op_def("fne", !=) { op_values(int, float32, float32) }
- op_def("flt", <) { op_values(int, float32, float32) }
- op_def("fle", <=) { op_values(int, float32, float32) }
- op_def("fgt", >) { op_values(int, float32, float32) }
- op_def("fge", >=) { op_values(int, float32, float32) }
- op_def("flt_inv") { op_values(int, float32, float32) }
- op_def("fle_inv") { op_values(int, float32, float32) }
- op_def("fgt_inv") { op_values(int, float32, float32) }
- op_def("fge_inv") { op_values(int, float32, float32) }
- op_def("deq", ==) { op_values(int, float64, float64) }
- op_def("dne", !=) { op_values(int, float64, float64) }
- op_def("dlt", <) { op_values(int, float64, float64) }
- op_def("dle", <=) { op_values(int, float64, float64) }
- op_def("dgt", >) { op_values(int, float64, float64) }
- op_def("dge", >=) { op_values(int, float64, float64) }
- op_def("dlt_inv") { op_values(int, float64, float64) }
- op_def("dle_inv") { op_values(int, float64, float64) }
- op_def("dgt_inv") { op_values(int, float64, float64) }
- op_def("dge_inv") { op_values(int, float64, float64) }
- op_def("nfeq", ==) { op_values(int, nfloat, nfloat) }
- op_def("nfne", !=) { op_values(int, nfloat, nfloat) }
- op_def("nflt", <) { op_values(int, nfloat, nfloat) }
- op_def("nfle", <=) { op_values(int, nfloat, nfloat) }
- op_def("nfgt", >) { op_values(int, nfloat, nfloat) }
- op_def("nfge", >=) { op_values(int, nfloat, nfloat) }
- op_def("nflt_inv") { op_values(int, nfloat, nfloat) }
- op_def("nfle_inv") { op_values(int, nfloat, nfloat) }
- op_def("nfgt_inv") { op_values(int, nfloat, nfloat) }
- op_def("nfge_inv") { op_values(int, nfloat, nfloat) }
- op_def("is_fnan") { op_values(int, float32) }
- op_def("is_finf") { op_values(int, float32) }
- op_def("is_ffinite") { op_values(int, float32) }
- op_def("is_dnan") { op_values(int, float64) }
- op_def("is_dinf") { op_values(int, float64) }
- op_def("is_dfinite") { op_values(int, float64) }
- op_def("is_nfnan") { op_values(int, nfloat) }
- op_def("is_nfinf") { op_values(int, nfloat) }
- op_def("is_nffinite") { op_values(int, nfloat) }
+ op_def("icmp") { op_values(int, int, int),
+ op_intrinsic(jit_int_cmp, i_ii) }
+ op_def("icmp_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_cmp, i_II) }
+ op_def("lcmp") { op_values(int, long, long),
+ op_intrinsic(jit_long_cmp, i_ll) }
+ op_def("lcmp_un") { op_values(int, long, long),
+ op_intrinsic(jit_ulong_cmp, i_LL) }
+ op_def("fcmpl") { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_cmpl, i_ff) }
+ op_def("fcmpg") { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_cmpg, i_ff) }
+ op_def("dcmpl") { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_cmpl, i_dd) }
+ op_def("dcmpg") { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_cmpg, i_dd) }
+ op_def("nfcmpl") { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_cmpl, i_DD) }
+ op_def("nfcmpg") { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_cmpg, i_DD) }
+ op_def("ieq", ==) { op_values(int, int, int),
+ op_intrinsic(jit_int_eq, i_ii) }
+ op_def("ine", !=) { op_values(int, int, int),
+ op_intrinsic(jit_int_ne, i_ii) }
+ op_def("ilt", <) { op_values(int, int, int),
+ op_intrinsic(jit_int_lt, i_ii) }
+ op_def("ilt_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_lt, i_II) }
+ op_def("ile", <=) { op_values(int, int, int),
+ op_intrinsic(jit_int_le, i_ii) }
+ op_def("ile_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_le, i_II) }
+ op_def("igt", >) { op_values(int, int, int),
+ op_intrinsic(jit_int_gt, i_ii) }
+ op_def("igt_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_gt, i_II) }
+ op_def("ige", >=) { op_values(int, int, int),
+ op_intrinsic(jit_int_ge, i_ii) }
+ op_def("ige_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_ge, i_II) }
+ op_def("leq", ==) { op_values(int, long, long),
+ op_intrinsic(jit_long_eq, i_ll) }
+ op_def("lne", !=) { op_values(int, long, long),
+ op_intrinsic(jit_long_ne, i_ll) }
+ op_def("llt", <) { op_values(int, long, long),
+ op_intrinsic(jit_long_lt, i_ll) }
+ op_def("llt_un") { op_values(int, long, long),
+ op_intrinsic(jit_ulong_lt, i_LL) }
+ op_def("lle", <=) { op_values(int, long, long),
+ op_intrinsic(jit_long_le, i_ll) }
+ op_def("lle_un") { op_values(int, long, long),
+ op_intrinsic(jit_ulong_le, i_LL) }
+ op_def("lgt", >) { op_values(int, long, long),
+ op_intrinsic(jit_long_gt, i_ll) }
+ op_def("lgt_un") { op_values(int, long, long),
+ op_intrinsic(jit_ulong_gt, i_LL) }
+ op_def("lge", >=) { op_values(int, long, long),
+ op_intrinsic(jit_long_ge, i_ll) }
+ op_def("lge_un") { op_values(int, long, long),
+ op_intrinsic(jit_ulong_ge, i_LL) }
+ op_def("feq", ==) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_eq, i_ff) }
+ op_def("fne", !=) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_ne, i_ff) }
+ op_def("flt", <) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_lt, i_ff) }
+ op_def("fle", <=) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_le, i_ff) }
+ op_def("fgt", >) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_gt, i_ff) }
+ op_def("fge", >=) { op_values(int, float32, float32),
+ op_intrinsic(jit_float32_ge, i_ff) }
+ op_def("flt_inv") { op_values(int, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_FGE") }
+ op_def("fle_inv") { op_values(int, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_FGT") }
+ op_def("fgt_inv") { op_values(int, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_FLE") }
+ op_def("fge_inv") { op_values(int, float32, float32),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_FLT") }
+ op_def("deq", ==) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_eq, i_dd) }
+ op_def("dne", !=) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_ne, i_dd) }
+ op_def("dlt", <) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_lt, i_dd) }
+ op_def("dle", <=) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_le, i_dd) }
+ op_def("dgt", >) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_gt, i_dd) }
+ op_def("dge", >=) { op_values(int, float64, float64),
+ op_intrinsic(jit_float64_ge, i_dd) }
+ op_def("dlt_inv") { op_values(int, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_DGE") }
+ op_def("dle_inv") { op_values(int, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_DGT") }
+ op_def("dgt_inv") { op_values(int, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_DLE") }
+ op_def("dge_inv") { op_values(int, float64, float64),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_DLT") }
+ op_def("nfeq", ==) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_eq, i_DD) }
+ op_def("nfne", !=) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_ne, i_DD) }
+ op_def("nflt", <) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_lt, i_DD) }
+ op_def("nfle", <=) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_le, i_DD) }
+ op_def("nfgt", >) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_gt, i_DD) }
+ op_def("nfge", >=) { op_values(int, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_ge, i_DD) }
+ op_def("nflt_inv") { op_values(int, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_NFGE") }
+ op_def("nfle_inv") { op_values(int, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_NFGT") }
+ op_def("nfgt_inv") { op_values(int, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_NFLE") }
+ op_def("nfge_inv") { op_values(int, nfloat, nfloat),
+ op_intrinsic("_JIT_INTRINSIC_FLAG_NOT | JIT_OP_NFLT") }
+ op_def("is_fnan") { op_values(int, float32),
+ op_intrinsic(jit_float32_is_nan, i_f) }
+ op_def("is_finf") { op_values(int, float32),
+ op_intrinsic(jit_float32_is_inf, i_f) }
+ op_def("is_ffinite") { op_values(int, float32),
+ op_intrinsic(jit_float32_is_finite, i_f) }
+ op_def("is_dnan") { op_values(int, float64),
+ op_intrinsic(jit_float64_is_nan, i_d) }
+ op_def("is_dinf") { op_values(int, float64),
+ op_intrinsic(jit_float64_is_inf, i_d) }
+ op_def("is_dfinite") { op_values(int, float64),
+ op_intrinsic(jit_float64_is_finite, i_d) }
+ op_def("is_nfnan") { op_values(int, nfloat),
+ op_intrinsic(jit_nfloat_is_nan, i_D) }
+ op_def("is_nfinf") { op_values(int, nfloat),
+ op_intrinsic(jit_nfloat_is_inf, i_D) }
+ op_def("is_nffinite") { op_values(int, nfloat),
+ op_intrinsic(jit_nfloat_is_finite, i_D) }
/*
* Mathematical functions.
*/
- op_def("facos") { op_values(float32, float32) }
- op_def("fasin") { op_values(float32, float32) }
- op_def("fatan") { op_values(float32, float32) }
- op_def("fatan2") { op_values(float32, float32, float32) }
- op_def("fceil") { op_values(float32, float32) }
- op_def("fcos") { op_values(float32, float32) }
- op_def("fcosh") { op_values(float32, float32) }
- op_def("fexp") { op_values(float32, float32) }
- op_def("ffloor") { op_values(float32, float32) }
- op_def("flog") { op_values(float32, float32) }
- op_def("flog10") { op_values(float32, float32) }
- op_def("fpow") { op_values(float32, float32, float32) }
- op_def("frint") { op_values(float32, float32) }
- op_def("fround") { op_values(float32, float32) }
- op_def("fsin") { op_values(float32, float32) }
- op_def("fsinh") { op_values(float32, float32) }
- op_def("fsqrt") { op_values(float32, float32) }
- op_def("ftan") { op_values(float32, float32) }
- op_def("ftanh") { op_values(float32, float32) }
- op_def("ftrunc") { op_values(float32, float32) }
- op_def("dacos") { op_values(float64, float64) }
- op_def("dasin") { op_values(float64, float64) }
- op_def("datan") { op_values(float64, float64) }
- op_def("datan2") { op_values(float64, float64, float64)}
- op_def("dceil") { op_values(float64, float64) }
- op_def("dcos") { op_values(float64, float64) }
- op_def("dcosh") { op_values(float64, float64) }
- op_def("dexp") { op_values(float64, float64) }
- op_def("dfloor") { op_values(float64, float64) }
- op_def("dlog") { op_values(float64, float64) }
- op_def("dlog10") { op_values(float64, float64) }
- op_def("dpow") { op_values(float64, float64, float64) }
- op_def("drint") { op_values(float64, float64) }
- op_def("dround") { op_values(float64, float64) }
- op_def("dsin") { op_values(float64, float64) }
- op_def("dsinh") { op_values(float64, float64) }
- op_def("dsqrt") { op_values(float64, float64) }
- op_def("dtan") { op_values(float64, float64) }
- op_def("dtanh") { op_values(float64, float64) }
- op_def("dtrunc") { op_values(float64, float64) }
- op_def("nfacos") { op_values(nfloat, nfloat) }
- op_def("nfasin") { op_values(nfloat, nfloat) }
- op_def("nfatan") { op_values(nfloat, nfloat) }
- op_def("nfatan2") { op_values(nfloat, nfloat, nfloat) }
- op_def("nfceil") { op_values(nfloat, nfloat) }
- op_def("nfcos") { op_values(nfloat, nfloat) }
- op_def("nfcosh") { op_values(nfloat, nfloat) }
- op_def("nfexp") { op_values(nfloat, nfloat) }
- op_def("nffloor") { op_values(nfloat, nfloat) }
- op_def("nflog") { op_values(nfloat, nfloat) }
- op_def("nflog10") { op_values(nfloat, nfloat) }
- op_def("nfpow") { op_values(nfloat, nfloat, nfloat) }
- op_def("nfrint") { op_values(nfloat, nfloat) }
- op_def("nfround") { op_values(nfloat, nfloat) }
- op_def("nfsin") { op_values(nfloat, nfloat) }
- op_def("nfsinh") { op_values(nfloat, nfloat) }
- op_def("nfsqrt") { op_values(nfloat, nfloat) }
- op_def("nftan") { op_values(nfloat, nfloat) }
- op_def("nftanh") { op_values(nfloat, nfloat) }
- op_def("nftrunc") { op_values(nfloat, nfloat) }
+ op_def("facos") { op_values(float32, float32),
+ op_intrinsic(jit_float32_acos, f_f) }
+ op_def("fasin") { op_values(float32, float32),
+ op_intrinsic(jit_float32_asin, f_f) }
+ op_def("fatan") { op_values(float32, float32),
+ op_intrinsic(jit_float32_atan, f_f) }
+ op_def("fatan2") { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_atan2, f_ff) }
+ op_def("fceil") { op_values(float32, float32),
+ op_intrinsic(jit_float32_ceil, f_f) }
+ op_def("fcos") { op_values(float32, float32),
+ op_intrinsic(jit_float32_cos, f_f) }
+ op_def("fcosh") { op_values(float32, float32),
+ op_intrinsic(jit_float32_cosh, f_f) }
+ op_def("fexp") { op_values(float32, float32),
+ op_intrinsic(jit_float32_exp, f_f) }
+ op_def("ffloor") { op_values(float32, float32),
+ op_intrinsic(jit_float32_floor, f_f) }
+ op_def("flog") { op_values(float32, float32),
+ op_intrinsic(jit_float32_log, f_f) }
+ op_def("flog10") { op_values(float32, float32),
+ op_intrinsic(jit_float32_log10, f_f) }
+ op_def("fpow") { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_pow, f_ff) }
+ op_def("frint") { op_values(float32, float32),
+ op_intrinsic(jit_float32_rint, f_f) }
+ op_def("fround") { op_values(float32, float32),
+ op_intrinsic(jit_float32_round, f_f) }
+ op_def("fsin") { op_values(float32, float32),
+ op_intrinsic(jit_float32_sin, f_f) }
+ op_def("fsinh") { op_values(float32, float32),
+ op_intrinsic(jit_float32_sinh, f_f) }
+ op_def("fsqrt") { op_values(float32, float32),
+ op_intrinsic(jit_float32_sqrt, f_f) }
+ op_def("ftan") { op_values(float32, float32),
+ op_intrinsic(jit_float32_tan, f_f) }
+ op_def("ftanh") { op_values(float32, float32),
+ op_intrinsic(jit_float32_tanh, f_f) }
+ op_def("ftrunc") { op_values(float32, float32),
+ op_intrinsic(jit_float32_trunc, f_f) }
+ op_def("dacos") { op_values(float64, float64),
+ op_intrinsic(jit_float64_acos, d_d) }
+ op_def("dasin") { op_values(float64, float64),
+ op_intrinsic(jit_float64_asin, d_d) }
+ op_def("datan") { op_values(float64, float64),
+ op_intrinsic(jit_float64_atan, d_d) }
+ op_def("datan2") { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_atan2, d_dd) }
+ op_def("dceil") { op_values(float64, float64),
+ op_intrinsic(jit_float64_ceil, d_d) }
+ op_def("dcos") { op_values(float64, float64),
+ op_intrinsic(jit_float64_cos, d_d) }
+ op_def("dcosh") { op_values(float64, float64),
+ op_intrinsic(jit_float64_cosh, d_d) }
+ op_def("dexp") { op_values(float64, float64),
+ op_intrinsic(jit_float64_exp, d_d) }
+ op_def("dfloor") { op_values(float64, float64),
+ op_intrinsic(jit_float64_floor, d_d) }
+ op_def("dlog") { op_values(float64, float64),
+ op_intrinsic(jit_float64_log, d_d) }
+ op_def("dlog10") { op_values(float64, float64),
+ op_intrinsic(jit_float64_log10, d_d) }
+ op_def("dpow") { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_pow, d_dd) }
+ op_def("drint") { op_values(float64, float64),
+ op_intrinsic(jit_float64_rint, d_d) }
+ op_def("dround") { op_values(float64, float64),
+ op_intrinsic(jit_float64_round, d_d) }
+ op_def("dsin") { op_values(float64, float64),
+ op_intrinsic(jit_float64_sin, d_d) }
+ op_def("dsinh") { op_values(float64, float64),
+ op_intrinsic(jit_float64_sinh, d_d) }
+ op_def("dsqrt") { op_values(float64, float64),
+ op_intrinsic(jit_float64_sqrt, d_d) }
+ op_def("dtan") { op_values(float64, float64),
+ op_intrinsic(jit_float64_tan, d_d) }
+ op_def("dtanh") { op_values(float64, float64),
+ op_intrinsic(jit_float64_tanh, d_d) }
+ op_def("dtrunc") { op_values(float64, float64),
+ op_intrinsic(jit_float64_trunc, d_d) }
+ op_def("nfacos") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_acos, D_D) }
+ op_def("nfasin") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_asin, D_D) }
+ op_def("nfatan") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_atan, D_D) }
+ op_def("nfatan2") { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_atan2, D_DD) }
+ op_def("nfceil") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_ceil, D_D) }
+ op_def("nfcos") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_cos, D_D) }
+ op_def("nfcosh") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_cosh, D_D) }
+ op_def("nfexp") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_exp, D_D) }
+ op_def("nffloor") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_floor, D_D) }
+ op_def("nflog") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_log, D_D) }
+ op_def("nflog10") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_log10, D_D) }
+ op_def("nfpow") { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_pow, D_DD) }
+ op_def("nfrint") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_rint, D_D) }
+ op_def("nfround") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_round, D_D) }
+ op_def("nfsin") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_sin, D_D) }
+ op_def("nfsinh") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_sinh, D_D) }
+ op_def("nfsqrt") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_sqrt, D_D) }
+ op_def("nftan") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_tan, D_D) }
+ op_def("nftanh") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_tanh, D_D) }
+ op_def("nftrunc") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_trunc, D_D) }
/*
* Absolute, minimum, maximum, and sign.
*/
- op_def("iabs") { op_values(int, int) }
- op_def("labs") { op_values(long, long) }
- op_def("fabs") { op_values(float32, float32) }
- op_def("dabs") { op_values(float64, float64) }
- op_def("nfabs") { op_values(nfloat, nfloat) }
- op_def("imin") { op_values(int, int, int) }
- op_def("imin_un") { op_values(int, int, int) }
- op_def("lmin") { op_values(long, long, long) }
- op_def("lmin_un") { op_values(long, long, long) }
- op_def("fmin") { op_values(float32, float32, float32) }
- op_def("dmin") { op_values(float64, float64, float64) }
- op_def("nfmin") { op_values(nfloat, nfloat, nfloat) }
- op_def("imax") { op_values(int, int, int) }
- op_def("imax_un") { op_values(int, int, int) }
- op_def("lmax") { op_values(long, long, long) }
- op_def("lmax_un") { op_values(long, long, long) }
- op_def("fmax") { op_values(float32, float32, float32) }
- op_def("dmax") { op_values(float64, float64, float64) }
- op_def("nfmax") { op_values(nfloat, nfloat, nfloat) }
- op_def("isign") { op_values(int, int) }
- op_def("lsign") { op_values(int, long) }
- op_def("fsign") { op_values(int, float32) }
- op_def("dsign") { op_values(int, float64) }
- op_def("nfsign") { op_values(int, nfloat) }
+ op_def("iabs") { op_values(int, int),
+ op_intrinsic(jit_int_abs, i_i) }
+ op_def("labs") { op_values(long, long),
+ op_intrinsic(jit_long_abs, l_l) }
+ op_def("fabs") { op_values(float32, float32),
+ op_intrinsic(jit_float32_abs, f_f) }
+ op_def("dabs") { op_values(float64, float64),
+ op_intrinsic(jit_float64_abs, d_d) }
+ op_def("nfabs") { op_values(nfloat, nfloat),
+ op_intrinsic(jit_nfloat_abs, D_D) }
+ op_def("imin") { op_values(int, int, int),
+ op_intrinsic(jit_int_min, i_ii) }
+ op_def("imin_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_min, I_II) }
+ op_def("lmin") { op_values(long, long, long),
+ op_intrinsic(jit_long_min, l_ll) }
+ op_def("lmin_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_min, L_LL) }
+ op_def("fmin") { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_min, f_ff) }
+ op_def("dmin") { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_min, d_dd) }
+ op_def("nfmin") { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_min, D_DD) }
+ op_def("imax") { op_values(int, int, int),
+ op_intrinsic(jit_int_max, i_ii) }
+ op_def("imax_un") { op_values(int, int, int),
+ op_intrinsic(jit_uint_max, I_II) }
+ op_def("lmax") { op_values(long, long, long),
+ op_intrinsic(jit_long_max, l_ll) }
+ op_def("lmax_un") { op_values(long, long, long),
+ op_intrinsic(jit_ulong_max, L_LL) }
+ op_def("fmax") { op_values(float32, float32, float32),
+ op_intrinsic(jit_float32_max, f_ff) }
+ op_def("dmax") { op_values(float64, float64, float64),
+ op_intrinsic(jit_float64_max, d_dd) }
+ op_def("nfmax") { op_values(nfloat, nfloat, nfloat),
+ op_intrinsic(jit_nfloat_max, D_DD) }
+ op_def("isign") { op_values(int, int),
+ op_intrinsic(jit_int_sign, i_i) }
+ op_def("lsign") { op_values(int, long),
+ op_intrinsic(jit_long_sign, i_l) }
+ op_def("fsign") { op_values(int, float32),
+ op_intrinsic(jit_float32_sign, i_f) }
+ op_def("dsign") { op_values(int, float64),
+ op_intrinsic(jit_float64_sign, i_d) }
+ op_def("nfsign") { op_values(int, nfloat),
+ op_intrinsic(jit_nfloat_sign, i_D) }
/*
* Pointer check opcodes.
*/
--- /dev/null
+/*
+ * jit-opcode-apply.c - Constant folding.
+ *
+ * Copyright (C) 2008 Southern Storm Software, Pty Ltd.
+ *
+ * This file is part of the libjit library.
+ *
+ * The libjit library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The libjit library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the libjit library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "jit-internal.h"
+#include "jit-rules.h"
+
+/*
+ * Signatures for the different intrinsics
+ */
+typedef jit_int (*jit_cf_i_i_func)(jit_int value);
+typedef jit_int (*jit_cf_i_ii_func)(jit_int value1, jit_int value2);
+typedef jit_int (*jit_cf_i_piii_func)(jit_int *result, jit_int value1, jit_int value2);
+typedef jit_int (*jit_cf_i_iI_func)(jit_int value1, jit_uint value2);
+typedef jit_int (*jit_cf_i_II_func)(jit_uint value1, jit_uint value2);
+typedef jit_uint (*jit_cf_I_I_func)(jit_uint value);
+typedef jit_uint (*jit_cf_I_II_func)(jit_uint value1, jit_uint value2);
+typedef jit_int (*jit_cf_i_pIII_func)(jit_uint *result, jit_uint value1, jit_uint value2);
+typedef jit_long (*jit_cf_l_l_func)(jit_long value);
+typedef jit_long (*jit_cf_l_ll_func)(jit_long value1, jit_long value2);
+typedef jit_int (*jit_cf_i_plll_func)(jit_long *result, jit_long value1, jit_long value2);
+typedef jit_int (*jit_cf_i_l_func)(jit_long value);
+typedef jit_int (*jit_cf_i_ll_func)(jit_long value1, jit_long value2);
+typedef jit_long (*jit_cf_l_lI_func)(jit_long value1, jit_uint value2);
+typedef jit_ulong (*jit_cf_L_L_func)(jit_ulong value);
+typedef jit_ulong (*jit_cf_L_LL_func)(jit_ulong value1, jit_ulong value2);
+typedef jit_int (*jit_cf_i_pLLL_func)(jit_ulong *result, jit_ulong value1, jit_ulong value2);
+typedef jit_int (*jit_cf_i_LL_func)(jit_ulong value1, jit_ulong value2);
+typedef jit_ulong (*jit_cf_L_LI_func)(jit_ulong value1, jit_uint value2);
+typedef jit_float32 (*jit_cf_f_f_func)(jit_float32 value);
+typedef jit_float32 (*jit_cf_f_ff_func)(jit_float32 value1, jit_float32 value2);
+typedef jit_int (*jit_cf_i_f_func)(jit_float32 value);
+typedef jit_int (*jit_cf_i_ff_func)(jit_float32 value1, jit_float32 value2);
+typedef jit_float64 (*jit_cf_d_d_func)(jit_float64 value);
+typedef jit_float64 (*jit_cf_d_dd_func)(jit_float64 value1, jit_float64 value2);
+typedef jit_int (*jit_cf_i_d_func)(jit_float64 value);
+typedef jit_int (*jit_cf_i_dd_func)(jit_float64 value1, jit_float64 value2);
+typedef jit_nfloat (*jit_cf_D_D_func)(jit_nfloat value);
+typedef jit_nfloat (*jit_cf_D_DD_func)(jit_nfloat value1, jit_nfloat value2);
+typedef jit_int (*jit_cf_i_D_func)(jit_nfloat value);
+typedef jit_int (*jit_cf_i_DD_func)(jit_nfloat value1, jit_nfloat value2);
+
+/*
+ * NOTE: The result type is already set in const_result.
+ */
+static int
+apply_conv(jit_constant_t *const_result, jit_value_t value, int overflow_check)
+{
+ jit_type_t srctype;
+ jit_constant_t const_value;
+
+ srctype = jit_type_promote_int(jit_type_normalize(value->type));
+ if(!srctype)
+ {
+ return 0;
+ }
+ const_value.type = srctype;
+ switch(srctype->kind)
+ {
+ case JIT_TYPE_INT:
+ {
+ const_value.un.int_value = value->address;
+ }
+ break;
+
+ case JIT_TYPE_UINT:
+ {
+ const_value.un.uint_value = value->address;
+ }
+ break;
+
+ case JIT_TYPE_LONG:
+ {
+#ifdef JIT_NATIVE_INT64
+ const_value.un.long_value = value->address;
+#else
+ const_value.un.long_value = *(jit_long *)(value->address);
+#endif
+ }
+ break;
+
+ case JIT_TYPE_ULONG:
+ {
+#ifdef JIT_NATIVE_INT64
+ const_value.un.ulong_value = value->address;
+#else
+ const_value.un.ulong_value = *(jit_ulong *)(value->address);
+#endif
+ }
+ break;
+
+ case JIT_TYPE_FLOAT32:
+ {
+ const_value.un.float32_value = *(jit_float32 *)(value->address);
+ }
+ break;
+
+ case JIT_TYPE_FLOAT64:
+ {
+ const_value.un.float64_value = *(jit_float64 *)(value->address);
+ }
+ break;
+
+ case JIT_TYPE_NFLOAT:
+ {
+ const_value.un.nfloat_value = *(jit_nfloat *)(value->address);
+ }
+ break;
+
+ default:
+ {
+ return 0;
+ }
+ }
+ return jit_constant_convert(const_result, &const_value,
+ const_result->type, overflow_check);
+}
+
+/*
+ * NOTE: value1 is guaranteed to be valid and a constant n entry of each
+ * of the apply_* functions.
+ * This is checked on entry of the public _jit_opcode_apply function.
+ */
+static int
+apply_i_i(jit_constant_t *const_result, jit_value_t value1,
+ jit_cf_i_i_func intrinsic)
+{
+ if(value1->is_nint_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(value1->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_ii(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_ii_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(value1->address,
+ value2->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_piii(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_piii_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ return (*intrinsic)(&(const_result->un.int_value),
+ value1->address, value2->address);
+ }
+ return 0;
+}
+
+static int
+apply_i_iI(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_iI_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(value1->address,
+ value2->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_II(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_II_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(value1->address, value2->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_I_I(jit_constant_t *const_result, jit_value_t value1,
+ jit_cf_I_I_func intrinsic)
+{
+ if(value1->is_nint_constant)
+ {
+ const_result->un.uint_value = (*intrinsic)(value1->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_I_II(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_I_II_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ const_result->un.uint_value = (*intrinsic)(value1->address, value2->address);
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_pIII(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_pIII_func intrinsic)
+{
+ if(value1->is_nint_constant && value2 && value2->is_nint_constant)
+ {
+ return (*intrinsic)(&(const_result->un.uint_value),
+ value1->address, value2->address);
+ }
+ return 0;
+}
+
+static int
+apply_l_l(jit_constant_t *const_result, jit_value_t value1,
+ jit_cf_l_l_func intrinsic)
+{
+#ifdef JIT_NATIVE_INT64
+ const_result->un.long_value = (*intrinsic)(value1->address);
+#else
+ const_result->un.long_value = (*intrinsic)(*(jit_long *)(value1->address));
+#endif
+ return 1;
+}
+
+static int
+apply_l_ll(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_l_ll_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.long_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.long_value = (*intrinsic)(*(jit_long *)(value1->address),
+ *(jit_long *)(value2->address));
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_plll(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_plll_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ return (*intrinsic)(&(const_result->un.long_value),
+ value1->address, value2->address);
+#else
+ return (*intrinsic)(&(const_result->un.long_value),
+ *(jit_long *)(value1->address),
+ *(jit_long *)(value2->address)))
+#endif
+ }
+ return 0;
+}
+
+static int
+apply_i_l(jit_constant_t *const_result,
+ jit_value_t value, jit_cf_i_l_func intrinsic)
+{
+#ifdef JIT_NATIVE_INT64
+ const_result->un.int_value = (*intrinsic)(value->address);
+#else
+ const_result->un.int_value = (*intrinsic)(*(jit_long *)(value->address));
+#endif
+ return 1;
+}
+
+static int
+apply_i_ll(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_ll_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.int_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.int_value = (*intrinsic)(*(jit_long *)(value1->address),
+ *(jit_long *)(value2->address));
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_l_lI(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_l_lI_func intrinsic)
+{
+ if(value2 && value2->is_nint_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.long_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.long_value = (*intrinsic)(*(jit_long *)(value1->address),
+ value2->address);
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_L_L(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_L_L_func intrinsic)
+{
+#ifdef JIT_NATIVE_INT64
+ const_result->un.ulong_value = (*intrinsic)(value->address);
+#else
+ const_result->un.ulong_value = (*intrinsic)(*(jit_ulong *)(value->address));
+#endif
+ return 1;
+}
+
+static int
+apply_L_LL(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_L_LL_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.ulong_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.ulong_value = (*intrinsic)(*(jit_ulong *)(value1->address),
+ *(jit_ulong *)(value2->address));
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_pLLL(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_pLLL_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ return (*intrinsic)(&(const_result->un.ulong_value),
+ value1->address, value2->address);
+#else
+ return (*intrinsic)(&(const_result->un.ulong_value),
+ *(jit_ulong *)(value1->address),
+ *(jit_ulong *)(value2->address));
+#endif
+ }
+ return 0;
+}
+
+static int
+apply_i_LL(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_LL_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.int_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.int_value = (*intrinsic)(*(jit_ulong *)(value1->address),
+ *(jit_ulong *)(value2->address));
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_L_LI(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_L_LI_func intrinsic)
+{
+ if(value2 && value2->is_nint_constant)
+ {
+#ifdef JIT_NATIVE_INT64
+ const_result->un.ulong_value = (*intrinsic)(value1->address,
+ value2->address);
+#else
+ const_result->un.ulong_value = (*intrinsic)(*(jit_ulong *)(value1->address),
+ value2->address);
+#endif
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_f_f(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_f_f_func intrinsic)
+{
+ const_result->un.float32_value = (*intrinsic)(*(jit_float32 *)(value->address));
+ return 1;
+}
+
+static int
+apply_f_ff(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_f_ff_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.float32_value = (*intrinsic)(*(jit_float32 *)(value1->address),
+ *(jit_float32 *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_f(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_i_f_func intrinsic)
+{
+ const_result->un.int_value = (*intrinsic)(*(jit_float32 *)(value->address));
+ return 1;
+}
+
+static int
+apply_i_ff(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_ff_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(*(jit_float32 *)(value1->address),
+ *(jit_float32 *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_d_d(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_d_d_func intrinsic)
+{
+ const_result->un.float64_value = (*intrinsic)(*(jit_float64 *)(value->address));
+ return 1;
+}
+
+static int
+apply_d_dd(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_d_dd_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.float64_value = (*intrinsic)(*(jit_float64 *)(value1->address),
+ *(jit_float64 *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_d(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_i_d_func intrinsic)
+{
+ const_result->un.int_value = (*intrinsic)(*(jit_float64 *)(value->address));
+ return 1;
+}
+
+static int
+apply_i_dd(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_dd_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(*(jit_float64 *)(value1->address),
+ *(jit_float64 *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_D_D(jit_constant_t *const_result, jit_value_t value,
+ jit_cf_D_D_func intrinsic)
+{
+ const_result->un.nfloat_value = (*intrinsic)(*(jit_nfloat *)(value->address));
+ return 1;
+}
+
+static int
+apply_D_DD(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_D_DD_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.nfloat_value = (*intrinsic)(*(jit_nfloat *)(value1->address),
+ *(jit_nfloat *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+apply_i_D(jit_constant_t *const_result,
+ jit_value_t value, jit_cf_i_D_func intrinsic)
+{
+ const_result->un.int_value = (*intrinsic)(*(jit_nfloat *)(value->address));
+ return 1;
+}
+
+static int
+apply_i_DD(jit_constant_t *const_result,
+ jit_value_t value1, jit_value_t value2,
+ jit_cf_i_DD_func intrinsic)
+{
+ if(value2 && value2->is_constant)
+ {
+ const_result->un.int_value = (*intrinsic)(*(jit_nfloat *)(value1->address),
+ *(jit_nfloat *)(value2->address));
+ return 1;
+ }
+ return 0;
+}
+
+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_t
+_jit_opcode_apply(jit_function_t func, jit_uint opcode, jit_type_t dest_type,
+ jit_value_t value1, jit_value_t value2)
+{
+ const _jit_intrinsic_info_t *opcode_info;
+
+ if(!func || opcode >= JIT_OP_NUM_OPCODES)
+ {
+ return 0;
+ }
+ if((value1 == 0) || !(value1->is_constant))
+ {
+ return 0;
+ }
+ opcode_info = &(_jit_intrinsics[opcode]);
+ if((opcode_info->flags & _JIT_INTRINSIC_FLAG_MASK) ==
+ _JIT_INTRINSIC_FLAG_NOT)
+ {
+ jit_value_t value;
+
+ opcode = opcode_info->flags & ~_JIT_INTRINSIC_FLAG_MASK;
+ if(opcode >= JIT_OP_NUM_OPCODES)
+ {
+ return 0;
+ }
+ opcode_info = &(_jit_intrinsics[opcode]);
+ value = apply_opcode(func, opcode_info, dest_type, value1, value2);
+ if(value)
+ {
+ /*
+ * We have to apply a logical not to the constant
+ * jit_int result value.
+ */
+ value->address = !(value->address);
+ return value;
+ }
+ }
+ else if((opcode_info->flags & _JIT_INTRINSIC_FLAG_MASK) ==
+ _JIT_INTRINSIC_FLAG_NONE)
+ {
+ return apply_opcode(func, opcode_info, dest_type, value1, value2);
+ }
+ return 0;
+}
+