static inline rtx emit_partition_copy (rtx dest, rtx src, int unsignedsrcp, tree sizeexp) { rtx seq; start_sequence (); if (GET_MODE (src) != VOIDmode && GET_MODE (src) != GET_MODE (dest)) src = convert_to_mode (GET_MODE (dest), src, unsignedsrcp); if (GET_MODE (src) == BLKmode) { gcc_assert (GET_MODE (dest) == BLKmode); emit_block_move (dest, src, expr_size (sizeexp), BLOCK_OP_NORMAL); } else emit_move_insn (dest, src); seq = get_insns (); end_sequence (); return seq; }
static void do_compare_and_jump (tree treeop0, tree treeop1, enum rtx_code signed_code, enum rtx_code unsigned_code, rtx if_false_label, rtx if_true_label, int prob) { rtx op0, op1; tree type; enum machine_mode mode; int unsignedp; enum rtx_code code; /* Don't crash if the comparison was erroneous. */ op0 = expand_normal (treeop0); if (TREE_CODE (treeop0) == ERROR_MARK) return; op1 = expand_normal (treeop1); if (TREE_CODE (treeop1) == ERROR_MARK) return; type = TREE_TYPE (treeop0); mode = TYPE_MODE (type); if (TREE_CODE (treeop0) == INTEGER_CST && (TREE_CODE (treeop1) != INTEGER_CST || (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (treeop1)))))) { /* op0 might have been replaced by promoted constant, in which case the type of second argument should be used. */ type = TREE_TYPE (treeop1); mode = TYPE_MODE (type); } unsignedp = TYPE_UNSIGNED (type); code = unsignedp ? unsigned_code : signed_code; #ifdef HAVE_canonicalize_funcptr_for_compare /* If function pointers need to be "canonicalized" before they can be reliably compared, then canonicalize them. Only do this if *both* sides of the comparison are function pointers. If one side isn't, we want a noncanonicalized comparison. See PR middle-end/17564. */ if (HAVE_canonicalize_funcptr_for_compare && TREE_CODE (TREE_TYPE (treeop0)) == POINTER_TYPE && TREE_CODE (TREE_TYPE (TREE_TYPE (treeop0))) == FUNCTION_TYPE && TREE_CODE (TREE_TYPE (treeop1)) == POINTER_TYPE && TREE_CODE (TREE_TYPE (TREE_TYPE (treeop1))) == FUNCTION_TYPE) { rtx new_op0 = gen_reg_rtx (mode); rtx new_op1 = gen_reg_rtx (mode); emit_insn (gen_canonicalize_funcptr_for_compare (new_op0, op0)); op0 = new_op0; emit_insn (gen_canonicalize_funcptr_for_compare (new_op1, op1)); op1 = new_op1; } #endif do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, ((mode == BLKmode) ? expr_size (treeop0) : NULL_RTX), if_false_label, if_true_label, prob); }
static void do_compare_and_jump (tree exp, enum rtx_code signed_code, enum rtx_code unsigned_code, rtx if_false_label, rtx if_true_label) { rtx op0, op1; tree type; enum machine_mode mode; int unsignedp; enum rtx_code code; /* Don't crash if the comparison was erroneous. */ op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, VOIDmode, 0); if (TREE_CODE (TREE_OPERAND (exp, 0)) == ERROR_MARK) return; op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0); if (TREE_CODE (TREE_OPERAND (exp, 1)) == ERROR_MARK) return; type = TREE_TYPE (TREE_OPERAND (exp, 0)); mode = TYPE_MODE (type); if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST && (TREE_CODE (TREE_OPERAND (exp, 1)) != INTEGER_CST || (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))))))) { /* op0 might have been replaced by promoted constant, in which case the type of second argument should be used. */ type = TREE_TYPE (TREE_OPERAND (exp, 1)); mode = TYPE_MODE (type); } unsignedp = TREE_UNSIGNED (type); code = unsignedp ? unsigned_code : signed_code; #ifdef HAVE_canonicalize_funcptr_for_compare /* If function pointers need to be "canonicalized" before they can be reliably compared, then canonicalize them. */ if (HAVE_canonicalize_funcptr_for_compare && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))) == FUNCTION_TYPE)) { rtx new_op0 = gen_reg_rtx (mode); emit_insn (gen_canonicalize_funcptr_for_compare (new_op0, op0)); op0 = new_op0; } if (HAVE_canonicalize_funcptr_for_compare && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 1))) == POINTER_TYPE && (TREE_CODE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 1)))) == FUNCTION_TYPE)) { rtx new_op1 = gen_reg_rtx (mode); emit_insn (gen_canonicalize_funcptr_for_compare (new_op1, op1)); op1 = new_op1; } #endif /* Do any postincrements in the expression that was tested. */ emit_queue (); do_compare_rtx_and_jump (op0, op1, code, unsignedp, mode, ((mode == BLKmode) ? expr_size (TREE_OPERAND (exp, 0)) : NULL_RTX), if_false_label, if_true_label); }