From 5b31cd986c75c5f479967b8f9c1b4ac1fc322b1a Mon Sep 17 00:00:00 2001
From: Nagaraju Mekala <nmekala@xilix.com>
Date: Fri, 3 Aug 2018 15:41:39 +0530
Subject: [PATCH 29/53] 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 f59a71ac072..e33e1bc1482 100644
--- a/gcc/config/microblaze/microblaze.c
+++ b/gcc/config/microblaze/microblaze.c
@@ -3697,11 +3697,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)
@@ -3712,10 +3708,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
     {
@@ -3748,10 +3741,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)
     {
@@ -3766,10 +3756,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)
@@ -3785,10 +3772,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
     {
@@ -3830,7 +3814,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 7bc91602ca2..ddf01505bd8 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.17.1

