diff options
author | Andrea Corallo <akrl@sdf.org> | 2020-04-05 14:24:00 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-04-05 21:10:59 +0100 |
commit | e3dff709b75c83c3939727538aa0bd072c268687 (patch) | |
tree | 0a490c7e015a4c004ba22c7888342eb8948c4314 /src/comp.c | |
parent | 49a3790e684213a6247f20e8029947f82fefdb5b (diff) | |
download | emacs-e3dff709b75c83c3939727538aa0bd072c268687.tar.gz emacs-e3dff709b75c83c3939727538aa0bd072c268687.tar.bz2 emacs-e3dff709b75c83c3939727538aa0bd072c268687.zip |
* src/comp.c: Emit cast only when necessary.
Coerce only when the destination type is different from the current
one.
Diffstat (limited to 'src/comp.c')
-rw-r--r-- | src/comp.c | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/src/comp.c b/src/comp.c index 605e92680c7..75a2534b2ee 100644 --- a/src/comp.c +++ b/src/comp.c @@ -605,12 +605,17 @@ emit_cond_jump (gcc_jit_rvalue *test, } static gcc_jit_rvalue * -emit_cast (gcc_jit_type *new_type, gcc_jit_rvalue *obj) +emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj) { static ptrdiff_t i; + gcc_jit_type *old_type = gcc_jit_rvalue_get_type (obj); + + if (new_type == old_type) + return obj; + gcc_jit_field *orig_field = - type_to_cast_field (gcc_jit_rvalue_get_type (obj)); + type_to_cast_field (old_type); gcc_jit_field *dest_field = type_to_cast_field (new_type); gcc_jit_lvalue *tmp_u = @@ -667,7 +672,7 @@ emit_rvalue_from_long_long (long long n) 32)); return - emit_cast (comp.long_long_type, + emit_coerce (comp.long_long_type, gcc_jit_context_new_binary_op ( comp.ctxt, NULL, @@ -729,17 +734,17 @@ emit_ptr_arithmetic (gcc_jit_rvalue *ptr, gcc_jit_type *ptr_type, gcc_jit_context_new_rvalue_from_int (comp.ctxt, comp.uintptr_type, size_of_ptr_ref), - emit_cast (comp.uintptr_type, i)); + emit_coerce (comp.uintptr_type, i)); return - emit_cast ( + emit_coerce ( ptr_type, gcc_jit_context_new_binary_op ( comp.ctxt, NULL, GCC_JIT_BINARY_OP_PLUS, comp.uintptr_type, - emit_cast (comp.uintptr_type, ptr), + emit_coerce (comp.uintptr_type, ptr), offset)); } @@ -785,7 +790,7 @@ emit_XUNTAG (gcc_jit_rvalue *a, gcc_jit_type *type, long long lisp_word_tag) emit_comment ("XUNTAG"); #ifndef WIDE_EMACS_INT - return emit_cast ( + return emit_coerce ( gcc_jit_type_get_pointer (type), gcc_jit_context_new_binary_op ( comp.ctxt, @@ -798,7 +803,7 @@ emit_XUNTAG (gcc_jit_rvalue *a, gcc_jit_type *type, long long lisp_word_tag) comp.emacs_int_type, lisp_word_tag))); #else - return emit_cast ( + return emit_coerce ( gcc_jit_type_get_pointer (type), gcc_jit_context_new_binary_op ( comp.ctxt, @@ -806,9 +811,9 @@ emit_XUNTAG (gcc_jit_rvalue *a, gcc_jit_type *type, long long lisp_word_tag) GCC_JIT_BINARY_OP_MINUS, comp.unsigned_long_long_type, /* FIXME Should be XLP. */ - emit_cast (comp.unsigned_long_long_type, emit_XLI (a)), - emit_cast (comp.unsigned_long_long_type, - emit_rvalue_from_long_long (lisp_word_tag)))); + emit_coerce (comp.unsigned_long_long_type, emit_XLI (a)), + emit_coerce (comp.unsigned_long_long_type, + emit_rvalue_from_long_long (lisp_word_tag)))); #endif } @@ -859,7 +864,7 @@ emit_TAGGEDP (gcc_jit_rvalue *obj, ptrdiff_t tag) NULL, GCC_JIT_BINARY_OP_MINUS, comp.unsigned_type, - emit_cast (comp.unsigned_type, sh_res), + emit_coerce (comp.unsigned_type, sh_res), gcc_jit_context_new_rvalue_from_int ( comp.ctxt, comp.unsigned_type, @@ -951,7 +956,7 @@ emit_FIXNUMP (gcc_jit_rvalue *obj) NULL, GCC_JIT_BINARY_OP_MINUS, comp.unsigned_type, - emit_cast (comp.unsigned_type, sh_res), + emit_coerce (comp.unsigned_type, sh_res), gcc_jit_context_new_rvalue_from_int ( comp.ctxt, comp.unsigned_type, @@ -980,7 +985,7 @@ static gcc_jit_rvalue * emit_XFIXNUM (gcc_jit_rvalue *obj) { emit_comment ("XFIXNUM"); - gcc_jit_rvalue *i = emit_cast (comp.emacs_uint_type, emit_XLI (obj)); + gcc_jit_rvalue *i = emit_coerce (comp.emacs_uint_type, emit_XLI (obj)); if (!USE_LSB_TAG) { @@ -988,7 +993,7 @@ emit_XFIXNUM (gcc_jit_rvalue *obj) NULL, GCC_JIT_BINARY_OP_LSHIFT, comp.emacs_uint_type, - emit_cast (comp.emacs_uint_type, i), + emit_coerce (comp.emacs_uint_type, i), comp.inttypebits); return gcc_jit_context_new_binary_op (comp.ctxt, @@ -1016,8 +1021,8 @@ emit_INTEGERP (gcc_jit_rvalue *obj) NULL, GCC_JIT_BINARY_OP_LOGICAL_OR, comp.bool_type, - emit_cast (comp.bool_type, - emit_FIXNUMP (obj)), + emit_coerce (comp.bool_type, + emit_FIXNUMP (obj)), emit_BIGNUMP (obj)); } @@ -1031,8 +1036,8 @@ emit_NUMBERP (gcc_jit_rvalue *obj) GCC_JIT_BINARY_OP_LOGICAL_OR, comp.bool_type, emit_INTEGERP (obj), - emit_cast (comp.bool_type, - emit_FLOATP (obj))); + emit_coerce (comp.bool_type, + emit_FLOATP (obj))); } static gcc_jit_rvalue * @@ -1049,7 +1054,7 @@ emit_make_fixnum_LSB_TAG (gcc_jit_rvalue *n) NULL, GCC_JIT_BINARY_OP_LSHIFT, comp.emacs_int_type, - emit_cast (comp.emacs_uint_type, n), + emit_coerce (comp.emacs_uint_type, n), comp.inttypebits); tmp = gcc_jit_context_new_binary_op (comp.ctxt, @@ -1082,16 +1087,16 @@ emit_make_fixnum_MSB_TAG (gcc_jit_rvalue *n) */ gcc_jit_rvalue *intmask = - emit_cast (comp.emacs_uint_type, - emit_rvalue_from_long_long ((EMACS_INT_MAX - >> (INTTYPEBITS - 1)))); + emit_coerce (comp.emacs_uint_type, + emit_rvalue_from_long_long ((EMACS_INT_MAX + >> (INTTYPEBITS - 1)))); n = gcc_jit_context_new_binary_op ( comp.ctxt, NULL, GCC_JIT_BINARY_OP_BITWISE_AND, comp.emacs_uint_type, intmask, - emit_cast (comp.emacs_uint_type, n)); + emit_coerce (comp.emacs_uint_type, n)); n = gcc_jit_context_new_binary_op ( comp.ctxt, @@ -1103,12 +1108,12 @@ emit_make_fixnum_MSB_TAG (gcc_jit_rvalue *n) NULL, GCC_JIT_BINARY_OP_LSHIFT, comp.emacs_uint_type, - emit_cast (comp.emacs_uint_type, comp.lisp_int0), + emit_coerce (comp.emacs_uint_type, comp.lisp_int0), gcc_jit_context_new_rvalue_from_int (comp.ctxt, comp.emacs_uint_type, VALBITS)), n); - return emit_XLI (emit_cast (comp.emacs_int_type, n)); + return emit_XLI (emit_coerce (comp.emacs_int_type, n)); } @@ -1128,10 +1133,10 @@ emit_const_lisp_obj (Lisp_Object obj) SSDATA (Fprin1_to_string (obj, Qnil)))); if (NIL_IS_ZERO && EQ (obj, Qnil)) - return emit_cast (comp.lisp_obj_type, - gcc_jit_context_new_rvalue_from_ptr (comp.ctxt, - comp.void_ptr_type, - NULL)); + return emit_coerce (comp.lisp_obj_type, + gcc_jit_context_new_rvalue_from_ptr (comp.ctxt, + comp.void_ptr_type, + NULL)); imm_reloc_t reloc = obj_to_reloc (obj); return gcc_jit_lvalue_as_rvalue ( @@ -1321,10 +1326,10 @@ emit_PURE_P (gcc_jit_rvalue *ptr) NULL, GCC_JIT_BINARY_OP_MINUS, comp.uintptr_type, - emit_cast (comp.uintptr_type, ptr), - emit_cast (comp.uintptr_type, - gcc_jit_lvalue_as_rvalue ( - gcc_jit_rvalue_dereference (comp.pure_ref, NULL)))), + emit_coerce (comp.uintptr_type, ptr), + emit_coerce (comp.uintptr_type, + gcc_jit_lvalue_as_rvalue ( + gcc_jit_rvalue_dereference (comp.pure_ref, NULL)))), gcc_jit_context_new_rvalue_from_int (comp.ctxt, comp.uintptr_type, PURESIZE)); @@ -1358,7 +1363,7 @@ emit_mvar_val (Lisp_Object mvar) : gcc_jit_context_new_rvalue_from_long (comp.ctxt, comp.void_ptr_type, constant); - return emit_cast (comp.lisp_obj_type, word); + return emit_coerce (comp.lisp_obj_type, word); } /* Other const objects are fetched from the reloc array. */ return emit_const_lisp_obj (constant); @@ -1861,7 +1866,7 @@ static gcc_jit_rvalue * emit_consp (Lisp_Object insn) { gcc_jit_rvalue *x = emit_mvar_val (SECOND (insn)); - gcc_jit_rvalue *res = emit_cast (comp.bool_type, + gcc_jit_rvalue *res = emit_coerce (comp.bool_type, emit_CONSP (x)); return gcc_jit_context_new_call (comp.ctxt, NULL, @@ -2622,8 +2627,8 @@ define_CAR_CDR (void) GCC_JIT_BINARY_OP_LOGICAL_OR, comp.bool_type, gcc_jit_param_as_rvalue (param[1]), - emit_cast (comp.bool_type, - emit_CONSP (c))), + emit_coerce (comp.bool_type, + emit_CONSP (c))), is_cons_b, not_a_cons_b); comp.block = is_cons_b; @@ -2781,8 +2786,8 @@ define_add1_sub1 (void) GCC_JIT_BINARY_OP_LOGICAL_OR, comp.bool_type, gcc_jit_param_as_rvalue (param[1]), - emit_cast (comp.bool_type, - emit_FIXNUMP (n))); + emit_coerce (comp.bool_type, + emit_FIXNUMP (n))); emit_cond_jump ( gcc_jit_context_new_binary_op ( @@ -2865,8 +2870,8 @@ define_negate (void) GCC_JIT_BINARY_OP_LOGICAL_OR, comp.bool_type, gcc_jit_param_as_rvalue (param[1]), - emit_cast (comp.bool_type, - emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (n)))); + emit_coerce (comp.bool_type, + emit_FIXNUMP (gcc_jit_lvalue_as_rvalue (n)))); emit_cond_jump ( gcc_jit_context_new_binary_op ( |