+2013-09-17 Nick Clifton <nickc@redhat.com>
+
+ * config/rl78/rl78-real.md (bf): New pattern.
+ (bt): New pattern.
+ * config/rl78/rl78.c (rl78_print_operand_1): Handle %B.
+ (rl78_print_operand): Do not put a # before a %B.
+ * config/rl78/rl78.opt: Tweak doc strings.
+
2013-09-17 DJ Delorie <dj@redhat.com>
* config/rl78/constraints.md (Wcv): Allow up to $r31.
[(set (match_dup 0) (reg:HI AX_REG))]
)
+;; Bit test and branch insns.
+
+;; NOTE: These patterns will work for bits in other places, not just A.
+
+(define_insn "bf"
+ [(set (pc)
+ (if_then_else (eq (and (reg:QI A_REG)
+ (match_operand 0 "immediate_operand" "n"))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ ""
+ "bf\tA.%B0, $%1"
+)
+
+(define_insn "bt"
+ [(set (pc)
+ (if_then_else (ne (and (reg:QI A_REG)
+ (match_operand 0 "immediate_operand" "n"))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))]
+ ""
+ "bt\tA.%B0, $%1"
+)
+
+;; NOTE: These peepholes are fragile. They rely upon GCC generating
+;; a specific sequence on insns, based upon examination of test code.
+;; Improvements to GCC or using code other than the test code can result
+;; in the peephole not matching and the optimization being missed.
+
+(define_peephole2
+ [(set (match_operand:QI 1 "register_operand") (reg:QI A_REG))
+ (set (match_dup 1) (and:QI (match_dup 1) (match_operand 2 "immediate_operand")))
+ (set (pc) (if_then_else (eq (match_dup 1) (const_int 0))
+ (label_ref (match_operand 3 ""))
+ (pc)))]
+ "peep2_regno_dead_p (3, REGNO (operands[1]))
+ && exact_log2 (INTVAL (operands[2])) >= 0"
+ [(set (pc) (if_then_else (eq (and (reg:QI A_REG) (match_dup 2)) (const_int 0))
+ (label_ref (match_dup 3)) (pc)))]
+ )
+
+(define_peephole2
+ [(set (match_operand:QI 1 "register_operand") (reg:QI A_REG))
+ (set (match_dup 1) (and:QI (match_dup 1) (match_operand 2 "immediate_operand")))
+ (set (pc) (if_then_else (ne (match_dup 1) (const_int 0))
+ (label_ref (match_operand 3 ""))
+ (pc)))]
+ "peep2_regno_dead_p (3, REGNO (operands[1]))
+ && exact_log2 (INTVAL (operands[2])) >= 0"
+ [(set (pc) (if_then_else (ne (and (reg:QI A_REG) (match_dup 2)) (const_int 0))
+ (label_ref (match_dup 3)) (pc)))]
+ )
+
s - shift count mod 8
S - shift count mod 16
r - reverse shift count (8-(count mod 8))
+ B - bit position
h - bottom HI of an SI
H - top HI of an SI
fprintf (file, "%ld", INTVAL (op) & 0xffff);
else if (letter == 'e')
fprintf (file, "%ld", (INTVAL (op) >> 16) & 0xff);
+ else if (letter == 'B')
+ fprintf (file, "%d", exact_log2 (INTVAL (op)));
else if (letter == 'E')
fprintf (file, "%ld", (INTVAL (op) >> 24) & 0xff);
else if (letter == 'm')
static void
rl78_print_operand (FILE * file, rtx op, int letter)
{
- if (CONSTANT_P (op) && letter != 'u' && letter != 's' && letter != 'r' && letter != 'S')
+ if (CONSTANT_P (op) && letter != 'u' && letter != 's' && letter != 'r' && letter != 'S' && letter != 'B')
fprintf (file, "#");
rl78_print_operand_1 (file, op, letter);
}
config/rl78/rl78-opts.h
msim
-Target
+Target Report
Use the simulator runtime.
mmul=
Enum(rl78_mul_types) String(g13) Value(MUL_G13)
mallregs
-Target Mask(ALLREGS)
+Target Mask(ALLREGS) Report Optimization
Use all registers, reserving none for interrupt handlers.
mrelax
-Target
-Enable assembler and linker relaxation.
+Target Report Optimization
+Enable assembler and linker relaxation. Enabled by default at -Os.
mg10
-Target Mask(G10)
+Target Mask(G10) Report
Target the RL78/G10 series