From cdce4d18f9688b22580930b155206b1ff19ce497 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Thu, 16 Aug 2018 21:40:07 +0200 Subject: [PATCH] rs6000: Change the length attribute default This moves what is currently the default of the length attribute to the only branch instruction patterns where it applies, namely, the B-form instructions. It was used for the "jump" instruction as well before, but that is an I-form instruction and always has length 4. * config/rs6000/rs6000.md (length): Always define as const_int 4. (unnamed conditional branch define_insn): Set length to 4 or 8 depending on offset. (_): Similar, for alternative 0. (tf_): Ditto. From-SVN: r263601 --- gcc/ChangeLog | 8 +++++++ gcc/config/rs6000/rs6000.md | 47 +++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62969666e09..02a20b5b7c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-08-16 Segher Boessenkool + + * config/rs6000/rs6000.md (length): Always define as const_int 4. + (unnamed conditional branch define_insn): Set length to 4 or 8 + depending on offset. + (_): Similar, for alternative 0. + (tf_): Ditto. + 2018-08-16 Tamar Christina * expr.c (copy_blkmode_to_reg): Perform larger copies when safe. diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index d70b01b8ca7..45e42ffade1 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -243,18 +243,8 @@ ;; Is copying of this instruction disallowed? (define_attr "cannot_copy" "no,yes" (const_string "no")) -;; Length (in bytes). -; '(pc)' in the following doesn't include the instruction itself; it is -; calculated as if the instruction had zero size. -(define_attr "length" "" - (if_then_else (eq_attr "type" "branch") - (if_then_else (and (ge (minus (match_dup 0) (pc)) - (const_int -32768)) - (lt (minus (match_dup 0) (pc)) - (const_int 32764))) - (const_int 4) - (const_int 8)) - (const_int 4))) +;; Length of the instruction (in bytes). +(define_attr "length" "" (const_int 4)) ;; Processor type -- this attribute must exactly match the processor_type ;; enumeration in rs6000-opts.h. @@ -12346,7 +12336,14 @@ { return output_cbranch (operands[1], "%l0", 0, insn); } - [(set_attr "type" "branch")]) + [(set_attr "type" "branch") + (set (attr "length") + (if_then_else (and (ge (minus (match_dup 0) (pc)) + (const_int -32768)) + (lt (minus (match_dup 0) (pc)) + (const_int 32764))) + (const_int 4) + (const_int 8)))]) (define_insn "" [(set (pc) @@ -12716,7 +12713,17 @@ return " $+8\;b %l0"; } [(set_attr "type" "branch") - (set_attr "length" "*,16,20,20")]) + (set (attr "length") + (cond [(eq (symbol_ref "which_alternative") (const_int 0)) + (if_then_else (and (ge (minus (match_dup 0) (pc)) + (const_int -32768)) + (lt (minus (match_dup 0) (pc)) + (const_int 32764))) + (const_int 4) + (const_int 8)) + (eq (symbol_ref "which_alternative") (const_int 1)) + (const_int 16)] + (const_int 20)))]) ;; Now the splitter if we could not allocate the CTR register (define_split @@ -12795,7 +12802,17 @@ } } [(set_attr "type" "branch") - (set_attr "length" "*,16,20,20")]) + (set (attr "length") + (cond [(eq (symbol_ref "which_alternative") (const_int 0)) + (if_then_else (and (ge (minus (match_dup 0) (pc)) + (const_int -32768)) + (lt (minus (match_dup 0) (pc)) + (const_int 32764))) + (const_int 4) + (const_int 8)) + (eq (symbol_ref "which_alternative") (const_int 1)) + (const_int 16)] + (const_int 20)))]) ;; Now the splitter if we could not allocate the CTR register (define_split -- 2.30.2