| From 9e45ca7bd65fe327e01e93d3c539c9d8cf049b79 Mon Sep 17 00:00:00 2001 |
| From: Nagaraju Mekala <nmekala@xilix.com> |
| Date: Fri, 3 Aug 2018 15:41:39 +0530 |
| Subject: [PATCH 42/54] re-arrangement of the compare branches |
| |
| --- |
| gcc/config/microblaze/microblaze.c | 28 ++----- |
| gcc/config/microblaze/microblaze.md | 141 +++++++++++++++++------------------- |
| 2 files changed, 73 insertions(+), 96 deletions(-) |
| |
| diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c |
| index ba7ade4..fab79d9 100644 |
| --- a/gcc/config/microblaze/microblaze.c |
| +++ b/gcc/config/microblaze/microblaze.c |
| @@ -3695,11 +3695,7 @@ microblaze_expand_conditional_branch (machine_mode mode, rtx operands[]) |
| { |
| comp_reg = cmp_op0; |
| condition = gen_rtx_fmt_ee (signed_condition (code), mode, comp_reg, const0_rtx); |
| - if (mode == Pmode) |
| - emit_jump_insn (gen_condjump (condition, label1)); |
| - else |
| - emit_jump_insn (gen_long_condjump (condition, label1)); |
| - |
| + emit_jump_insn (gen_condjump (condition, label1)); |
| } |
| |
| else if (code == EQ || code == NE) |
| @@ -3710,10 +3706,7 @@ microblaze_expand_conditional_branch (machine_mode mode, rtx operands[]) |
| else |
| emit_insn (gen_xordi3 (comp_reg, cmp_op0, cmp_op1)); |
| condition = gen_rtx_fmt_ee (signed_condition (code), mode, comp_reg, const0_rtx); |
| - if (mode == SImode) |
| - emit_jump_insn (gen_condjump (condition, label1)); |
| - else |
| - emit_jump_insn (gen_long_condjump (condition, label1)); |
| + emit_jump_insn (gen_condjump (condition, label1)); |
| } |
| else |
| { |
| @@ -3746,10 +3739,7 @@ microblaze_expand_conditional_branch_reg (machine_mode mode, rtx operands[]) |
| comp_reg = cmp_op0; |
| condition = gen_rtx_fmt_ee (signed_condition (code), |
| mode, comp_reg, const0_rtx); |
| - if (mode == SImode) |
| - emit_jump_insn (gen_condjump (condition, label1)); |
| - else |
| - emit_jump_insn (gen_long_condjump (condition, label1)); |
| + emit_jump_insn (gen_condjump (condition, label1)); |
| } |
| else if (code == EQ) |
| { |
| @@ -3764,10 +3754,7 @@ microblaze_expand_conditional_branch_reg (machine_mode mode, rtx operands[]) |
| cmp_op1)); |
| } |
| condition = gen_rtx_EQ (mode, comp_reg, const0_rtx); |
| - if (mode == SImode) |
| - emit_jump_insn (gen_condjump (condition, label1)); |
| - else |
| - emit_jump_insn (gen_long_condjump (condition, label1)); |
| + emit_jump_insn (gen_condjump (condition, label1)); |
| |
| } |
| else if (code == NE) |
| @@ -3783,10 +3770,7 @@ microblaze_expand_conditional_branch_reg (machine_mode mode, rtx operands[]) |
| cmp_op1)); |
| } |
| condition = gen_rtx_NE (mode, comp_reg, const0_rtx); |
| - if (mode == SImode) |
| - emit_jump_insn (gen_condjump (condition, label1)); |
| - else |
| - emit_jump_insn (gen_long_condjump (condition, label1)); |
| + emit_jump_insn (gen_condjump (condition, label1)); |
| } |
| else |
| { |
| @@ -3828,7 +3812,7 @@ microblaze_expand_conditional_branch_df (rtx operands[]) |
| |
| emit_insn (gen_cstoredf4 (comp_reg, operands[0], cmp_op0, cmp_op1)); |
| condition = gen_rtx_NE (Pmode, comp_reg, const0_rtx); |
| - emit_jump_insn (gen_long_condjump (condition, operands[3])); |
| + emit_jump_insn (gen_condjump (condition, operands[3])); |
| } |
| |
| /* Implement TARGET_FRAME_POINTER_REQUIRED. */ |
| diff --git a/gcc/config/microblaze/microblaze.md b/gcc/config/microblaze/microblaze.md |
| index 0f41ac6..2213d6e 100644 |
| --- a/gcc/config/microblaze/microblaze.md |
| +++ b/gcc/config/microblaze/microblaze.md |
| @@ -2268,7 +2268,27 @@ else |
| (label_ref (match_operand 1)) |
| (pc)))]) |
| |
| -(define_insn "branch_zero64" |
| +(define_insn "branch_zero_64" |
| + [(set (pc) |
| + (if_then_else (match_operator:SI 0 "ordered_comparison_operator" |
| + [(match_operand:SI 1 "register_operand" "d") |
| + (const_int 0)]) |
| + (match_operand:SI 2 "pc_or_label_operand" "") |
| + (match_operand:SI 3 "pc_or_label_operand" ""))) |
| + ] |
| + "TARGET_MB_64" |
| + { |
| + if (operands[3] == pc_rtx) |
| + return "bea%C0i%?\t%z1,%2"; |
| + else |
| + return "bea%N0i%?\t%z1,%3"; |
| + } |
| + [(set_attr "type" "branch") |
| + (set_attr "mode" "none") |
| + (set_attr "length" "4")] |
| +) |
| + |
| +(define_insn "long_branch_zero" |
| [(set (pc) |
| (if_then_else (match_operator 0 "ordered_comparison_operator" |
| [(match_operand 1 "register_operand" "d") |
| @@ -2279,9 +2299,9 @@ else |
| "TARGET_MB_64" |
| { |
| if (operands[3] == pc_rtx) |
| - return "bea%C0i%?\t%z1,%2"; |
| + return "beal%C0i%?\t%z1,%2"; |
| else |
| - return "bea%N0i%?\t%z1,%3"; |
| + return "beal%N0i%?\t%z1,%3"; |
| } |
| [(set_attr "type" "branch") |
| (set_attr "mode" "none") |
| @@ -2310,9 +2330,9 @@ else |
| |
| (define_insn "branch_compare64" |
| [(set (pc) |
| - (if_then_else (match_operator 0 "cmp_op" |
| - [(match_operand 1 "register_operand" "d") |
| - (match_operand 2 "register_operand" "d") |
| + (if_then_else (match_operator:SI 0 "cmp_op" |
| + [(match_operand:SI 1 "register_operand" "d") |
| + (match_operand:SI 2 "register_operand" "d") |
| ]) |
| (label_ref (match_operand 3)) |
| (pc))) |
| @@ -2349,6 +2369,47 @@ else |
| (set_attr "length" "12")] |
| ) |
| |
| +(define_insn "long_branch_compare" |
| + [(set (pc) |
| + (if_then_else (match_operator 0 "cmp_op" |
| + [(match_operand 1 "register_operand" "d") |
| + (match_operand 2 "register_operand" "d") |
| + ]) |
| + (label_ref (match_operand 3)) |
| + (pc))) |
| + (clobber(reg:DI R_TMP))] |
| + "TARGET_MB_64" |
| + { |
| + operands[4] = gen_rtx_REG (DImode, MB_ABI_ASM_TEMP_REGNUM); |
| + enum rtx_code code = GET_CODE (operands[0]); |
| + |
| + if (code == GT || code == LE) |
| + { |
| + output_asm_insn ("cmpl\tr18,%z1,%z2", operands); |
| + code = swap_condition (code); |
| + } |
| + else if (code == GTU || code == LEU) |
| + { |
| + output_asm_insn ("cmplu\tr18,%z1,%z2", operands); |
| + code = swap_condition (code); |
| + } |
| + else if (code == GE || code == LT) |
| + { |
| + output_asm_insn ("cmpl\tr18,%z2,%z1", operands); |
| + } |
| + else if (code == GEU || code == LTU) |
| + { |
| + output_asm_insn ("cmplu\tr18,%z2,%z1", operands); |
| + } |
| + |
| + operands[0] = gen_rtx_fmt_ee (signed_condition (code), DImode, operands[4], const0_rtx); |
| + return "beal%C0i%?\tr18,%3"; |
| + } |
| + [(set_attr "type" "branch") |
| + (set_attr "mode" "none") |
| + (set_attr "length" "12")] |
| +) |
| + |
| (define_insn "branch_compare" |
| [(set (pc) |
| (if_then_else (match_operator:SI 0 "cmp_op" |
| @@ -2431,74 +2492,6 @@ else |
| |
| }) |
| |
| -;; Used to implement comparison instructions |
| -(define_expand "long_condjump" |
| - [(set (pc) |
| - (if_then_else (match_operand 0) |
| - (label_ref (match_operand 1)) |
| - (pc)))]) |
| - |
| -(define_insn "long_branch_zero" |
| - [(set (pc) |
| - (if_then_else (match_operator:DI 0 "ordered_comparison_operator" |
| - [(match_operand:DI 1 "register_operand" "d") |
| - (const_int 0)]) |
| - (match_operand:DI 2 "pc_or_label_operand" "") |
| - (match_operand:DI 3 "pc_or_label_operand" ""))) |
| - ] |
| - "TARGET_MB_64" |
| - { |
| - if (operands[3] == pc_rtx) |
| - return "beal%C0i%?\t%z1,%2"; |
| - else |
| - return "beal%N0i%?\t%z1,%3"; |
| - } |
| - [(set_attr "type" "branch") |
| - (set_attr "mode" "none") |
| - (set_attr "length" "4")] |
| -) |
| - |
| -(define_insn "long_branch_compare" |
| - [(set (pc) |
| - (if_then_else (match_operator:DI 0 "cmp_op" |
| - [(match_operand:DI 1 "register_operand" "d") |
| - (match_operand:DI 2 "register_operand" "d") |
| - ]) |
| - (label_ref (match_operand 3)) |
| - (pc))) |
| - (clobber(reg:DI R_TMP))] |
| - "TARGET_MB_64" |
| - { |
| - operands[4] = gen_rtx_REG (DImode, MB_ABI_ASM_TEMP_REGNUM); |
| - enum rtx_code code = GET_CODE (operands[0]); |
| - |
| - if (code == GT || code == LE) |
| - { |
| - output_asm_insn ("cmpl\tr18,%z1,%z2", operands); |
| - code = swap_condition (code); |
| - } |
| - else if (code == GTU || code == LEU) |
| - { |
| - output_asm_insn ("cmplu\tr18,%z1,%z2", operands); |
| - code = swap_condition (code); |
| - } |
| - else if (code == GE || code == LT) |
| - { |
| - output_asm_insn ("cmpl\tr18,%z2,%z1", operands); |
| - } |
| - else if (code == GEU || code == LTU) |
| - { |
| - output_asm_insn ("cmplu\tr18,%z2,%z1", operands); |
| - } |
| - |
| - operands[0] = gen_rtx_fmt_ee (signed_condition (code), DImode, operands[4], const0_rtx); |
| - return "beal%C0i%?\tr18,%3"; |
| - } |
| - [(set_attr "type" "branch") |
| - (set_attr "mode" "none") |
| - (set_attr "length" "12")] |
| -) |
| - |
| ;;---------------------------------------------------------------- |
| ;; Unconditional branches |
| ;;---------------------------------------------------------------- |
| -- |
| 2.7.4 |
| |