[ARC] Differentiate between ARCv1 and ARCv2 'h'-reg class for CMP insns.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 25 Apr 2017 12:03:19 +0000 (14:03 +0200)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Tue, 25 Apr 2017 12:03:19 +0000 (14:03 +0200)
gcc/
2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>

* config/arc/arc.md (cmpsi_cc_insn_mixed): Use 'h' register
constraint.
(cmpsi_cc_c_insn): Likewise.
(cbranchsi4_scratch): Compute proper instruction length using
compact_hreg_operand.
* config/arc/predicates.md (compact_hreg_operand): New predicate.

From-SVN: r247194

gcc/ChangeLog
gcc/config/arc/arc.md
gcc/config/arc/predicates.md

index 83f0adc3d3f7d136ed4628ae20cae72d647ee656..7fb9ee86c2816a0021a97ac32da8422120a7378e 100644 (file)
@@ -1,3 +1,12 @@
+2017-04-25  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * config/arc/arc.md (cmpsi_cc_insn_mixed): Use 'h' register
+       constraint.
+       (cmpsi_cc_c_insn): Likewise.
+       (cbranchsi4_scratch): Compute proper instruction length using
+       compact_hreg_operand.
+       * config/arc/predicates.md (compact_hreg_operand): New predicate.
+
 2017-04-25  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/80509
index f707bd0755e4832cea01d29c16d1b62f21a0e0ab..802c3e90bdd87b1e9da30a3f20dcb6c1fe633da7 100644 (file)
 ;; modifed cc user if second, but not first operand is a compact register.
 (define_insn "cmpsi_cc_insn_mixed"
   [(set (reg:CC CC_REG)
-       (compare:CC (match_operand:SI 0 "register_operand" "Rcq#q,  h, c, c,qRcq,c")
-                   (match_operand:SI 1 "nonmemory_operand"   "cO,Cm1,cI,cL, Cal,Cal")))]
+       (compare:CC (match_operand:SI 0 "register_operand" "Rcq#q,Rcqq,  h, c, c,qRcq,c")
+                   (match_operand:SI 1 "nonmemory_operand"   "cO,  hO,Cm1,cI,cL, Cal,Cal")))]
   ""
   "cmp%? %0,%B1%&"
   [(set_attr "type" "compare")
-   (set_attr "iscompact" "true,true,false,false,true_limm,false")
-   (set_attr "predicable" "no,no,no,yes,no,yes")
+   (set_attr "iscompact" "true,true,true,false,false,true_limm,false")
+   (set_attr "predicable" "no,no,no,no,yes,no,yes")
    (set_attr "cond" "set")
-   (set_attr "length" "*,*,4,4,*,8")])
+   (set_attr "length" "*,*,*,4,4,*,8")
+   (set_attr "cpu_facility" "av1,av2,*,*,*,*,*")])
 
 (define_insn "*cmpsi_cc_zn_insn"
   [(set (reg:CC_ZN CC_REG)
 
 (define_insn "*cmpsi_cc_c_insn"
   [(set (reg:CC_C CC_REG)
-       (compare:CC_C (match_operand:SI 0 "register_operand"  "Rcqq,  h, c,Rcqq,  c")
-                     (match_operand:SI 1 "nonmemory_operand"   "cO,Cm1,cI, Cal,Cal")))]
+       (compare:CC_C (match_operand:SI 0 "register_operand"  "Rcqq,Rcqq,  h, c,Rcqq,  c")
+                     (match_operand:SI 1 "nonmemory_operand"   "cO,  hO,Cm1,cI, Cal,Cal")))]
   ""
   "cmp%? %0,%S1%&"
   [(set_attr "type" "compare")
-   (set_attr "iscompact" "true,true,false,true_limm,false")
+   (set_attr "iscompact" "true,true,true,false,true_limm,false")
    (set_attr "cond" "set")
-   (set_attr "length" "*,*,4,*,8")])
+   (set_attr "length" "*,*,*,4,*,8")
+   (set_attr "cpu_facility" "av1,av2,*,*,*,*")])
 
 ;; Next come the scc insns.
 
                 return \"br%d0%* %1, %B2, %^%l3\";
        /* FALLTHRU */
        case 6: case 10:
-       case 12:return \"cmp%? %1, %B2\\n\\tb%d0%* %^%l3%&;br%d0 out of range\";
+       case 12:return \"cmp%? %1, %B2\\n\\tb%d0%* %^%l3%& ;br%d0 out of range\";
        default: fprintf (stderr, \"unexpected length %d\\n\", get_attr_length (insn)); fflush (stderr); gcc_unreachable ();
      }
    "
                    (minus (const_int 244)
                           (symbol_ref "get_attr_delay_slot_length (insn)"))))
           (const_int 4)
-          (match_operand:SI 1 "compact_register_operand" "")
+          (and (match_operand:SI 1 "compact_register_operand" "")
+               (match_operand:SI 2 "compact_hreg_operand" ""))
           (const_int 6)]
          (const_int 8))]
         (cond [(and (ge (minus (match_dup 3) (pc)) (const_int -256))
                     (le (minus (match_dup 3) (pc)) (const_int 244)))
                (const_int 8)
-               (match_operand:SI 1 "compact_register_operand" "")
+               (and (match_operand:SI 1 "compact_register_operand" "")
+                    (match_operand:SI 2 "compact_hreg_operand" ""))
                (const_int 10)]
               (const_int 12))))
    (set (attr "iscompact")
index 9e60cb773282149b18404a976a8fdf25f5897973..f4c2a80f2be84080ad7ccc1bffee097c53a3cb78 100644 (file)
   }
 )
 
+(define_predicate "compact_hreg_operand"
+  (match_code "reg, subreg")
+  {
+     if ((GET_MODE (op) != mode) && (mode != VOIDmode))
+        return 0;
+
+      return (GET_CODE (op) == REG)
+      && (REGNO (op) >= FIRST_PSEUDO_REGISTER
+               || (TARGET_V2 && REGNO (op) <= 31 && REGNO (op) != 30)
+               || !TARGET_V2);
+  }
+)
+
 ;; Return true if OP is an acceptable memory operand for ARCompact
 ;; 16-bit store instructions
 (define_predicate "compact_store_memory_operand"