annotate gcc/config/h8300/peepholes.md @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 ;; -----------------------------------------------------------------
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 ;; PEEPHOLE PATTERNS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 ;; -----------------------------------------------------------------
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 ;; Convert (A >> B) & C to (A & 255) >> B if C == 255 >> B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 [(parallel [(set (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 (lshiftrt:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 (match_operand:HI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 (clobber (match_operand:HI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 (match_operand:HI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 "INTVAL (operands[3]) == (255 >> INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 (lshiftrt:HI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 ;; Convert (A << B) & C to (A & 255) << B if C == 255 << B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 [(parallel [(set (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 (ashift:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 (match_operand:HI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 (clobber (match_operand:HI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 (match_operand:HI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 "INTVAL (operands[3]) == (255 << INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 (ashift:HI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 ;; Convert (A >> B) & C to (A & 255) >> B if C == 255 >> B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 [(parallel [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 (lshiftrt:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 (clobber (match_operand:SI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 (match_operand:SI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 "INTVAL (operands[3]) == (255 >> INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 (lshiftrt:SI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 ;; Convert (A << B) & C to (A & 255) << B if C == 255 << B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 [(parallel [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 (ashift:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 (clobber (match_operand:SI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 (match_operand:SI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 "INTVAL (operands[3]) == (255 << INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 (ashift:SI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81 ;; Convert (A >> B) & C to (A & 65535) >> B if C == 65535 >> B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 [(parallel [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 (lshiftrt:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 (clobber (match_operand:SI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 (match_operand:SI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 "INTVAL (operands[3]) == (65535 >> INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 (const_int 65535)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 (lshiftrt:SI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 ;; Convert (A << B) & C to (A & 65535) << B if C == 65535 << B.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103 [(parallel [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104 (ashift:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 (clobber (match_operand:SI 2 "" ""))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 (match_operand:SI 3 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 "INTVAL (operands[3]) == (65535 << INTVAL (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 (const_int 65535)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114 (parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 (ashift:SI (match_dup 0) (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 (clobber (match_dup 2))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119 ;; Cram four pushes into stm.l.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122 [(set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127 (match_operand:SI 2 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 (match_operand:SI 3 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 "TARGET_H8300S && !TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131 && (REGNO_REG_CLASS (REGNO (operands[3])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133 && REGNO (operands[2]) == REGNO (operands[0]) + 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 && REGNO (operands[3]) == REGNO (operands[0]) + 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 && (TARGET_H8300SX || REGNO (operands[0]) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 [(parallel [(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -12)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -16)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 (match_dup 3))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 (set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 (const_int -16)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
150 [(set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
151 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
152 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
153 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
154 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
155 (match_operand:SI 2 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
156 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
157 (match_operand:SI 3 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
158 "TARGET_H8300S && TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
159 && (REGNO_REG_CLASS (REGNO (operands[3])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
160 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
161 && REGNO (operands[2]) == REGNO (operands[0]) + 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
162 && REGNO (operands[3]) == REGNO (operands[0]) + 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
163 && (TARGET_H8300SX || REGNO (operands[0]) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
164 [(parallel [(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
165 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
166 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
167 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
168 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -12)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
169 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
170 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -16)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
171 (match_dup 3))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
172 (set (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
173 (plus:HI (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
174 (const_int -16)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
175 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
176
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
177 ;; Cram three pushes into stm.l.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
178
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
179 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
180 [(set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
181 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
182 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
183 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
184 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
185 (match_operand:SI 2 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
186 "TARGET_H8300S && !TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
187 && (REGNO_REG_CLASS (REGNO (operands[2])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
188 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
189 && REGNO (operands[2]) == REGNO (operands[0]) + 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
190 && (TARGET_H8300SX || (REGNO (operands[0]) & 3) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
191 [(parallel [(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
192 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
193 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
194 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
195 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -12)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
196 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
197 (set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
198 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
199 (const_int -12)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
200 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
201
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
202 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
203 [(set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
204 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
205 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
206 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
207 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
208 (match_operand:SI 2 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
209 "TARGET_H8300S && TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
210 && (REGNO_REG_CLASS (REGNO (operands[2])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
211 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
212 && REGNO (operands[2]) == REGNO (operands[0]) + 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
213 && (TARGET_H8300SX || (REGNO (operands[0]) & 3) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
214 [(parallel [(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
215 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
216 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
217 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
218 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -12)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
219 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
220 (set (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
221 (plus:HI (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
222 (const_int -12)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
223 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
224
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
225 ;; Cram two pushes into stm.l.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
226
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
227 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
228 [(set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
229 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
230 (set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
231 (match_operand:SI 1 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
232 "TARGET_H8300S && !TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
233 && (REGNO_REG_CLASS (REGNO (operands[1])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
234 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
235 && (TARGET_H8300SX || (REGNO (operands[0]) & 1) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
236 [(parallel [(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
237 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
238 (set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
239 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
240 (set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
241 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
242 (const_int -8)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
243 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
244
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
245 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
246 [(set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
247 (match_operand:SI 0 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
248 (set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
249 (match_operand:SI 1 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
250 "TARGET_H8300S && TARGET_NORMAL_MODE
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
251 && (REGNO_REG_CLASS (REGNO (operands[1])) == GENERAL_REGS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
252 && REGNO (operands[1]) == REGNO (operands[0]) + 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
253 && (TARGET_H8300SX || (REGNO (operands[0]) & 1) == 0))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
254 [(parallel [(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
255 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
256 (set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
257 (match_dup 1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
258 (set (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
259 (plus:HI (reg:HI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
260 (const_int -8)))])]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
261 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
262
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
263 ;; Turn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
264 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
265 ;; mov.w #2,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
266 ;; add.w r7,r0 (6 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
267 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
268 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
269 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
270 ;; mov.w r7,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
271 ;; adds #2,r0 (4 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
272
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
273 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
274 [(set (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
275 (match_operand:HI 1 "const_int_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
276 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
277 (plus:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
278 (match_operand:HI 2 "register_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
279 "REG_P (operands[0]) && REG_P (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
280 && REGNO (operands[0]) != REGNO (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
281 && (satisfies_constraint_J (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
282 || satisfies_constraint_L (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
283 || satisfies_constraint_N (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
284 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
285 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
286 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
287 (plus:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
288 (match_dup 1)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
289 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
290
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
291 ;; Turn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
292 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
293 ;; sub.l er0,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
294 ;; add.b #4,r0l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
295 ;; add.l er7,er0 (6 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
296 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
297 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
298 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
299 ;; mov.l er7,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
300 ;; adds #4,er0 (4 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
301
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
302 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
303 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
304 (match_operand:SI 1 "const_int_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
305 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
306 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
307 (match_operand:SI 2 "register_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
308 "REG_P (operands[0]) && REG_P (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
309 && REGNO (operands[0]) != REGNO (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
310 && (satisfies_constraint_L (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
311 || satisfies_constraint_N (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
312 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
313 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
314 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
315 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
316 (match_dup 1)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
317 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
318
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
319 ;; Turn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
320 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
321 ;; mov.l er7,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
322 ;; add.l #10,er0 (takes 8 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
323 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
324 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
325 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
326 ;; sub.l er0,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
327 ;; add.b #10,r0l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
328 ;; add.l er7,er0 (takes 6 bytes)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
329
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
330 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
331 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
332 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
333 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
334 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
335 (match_operand:SI 2 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
336 "operands[0] != stack_pointer_rtx
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
337 && REG_P (operands[0]) && REG_P (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
338 && REGNO (operands[0]) != REGNO (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
339 && !satisfies_constraint_L (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
340 && !satisfies_constraint_N (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
341 && ((INTVAL (operands[2]) & 0xff) == INTVAL (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
342 || (INTVAL (operands[2]) & 0xff00) == INTVAL (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
343 || INTVAL (operands[2]) == 0xffff
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
344 || INTVAL (operands[2]) == 0xfffe)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
345 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
346 (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
347 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
348 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
349 (match_dup 1)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
350 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
351
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
352 ;; Turn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
353 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
354 ;; subs #1,er4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
355 ;; mov.w r4,r4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
356 ;; bne .L2028
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
357 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
358 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
359 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
360 ;; dec.w #1,r4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
361 ;; bne .L2028
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
362
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
363 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
364 [(set (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
365 (plus:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
366 (match_operand 1 "incdec_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
367 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
368 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
369 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
370 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
371 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
372 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
373 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
374 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
375 [(set (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
376 (unspec:HI [(match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
377 (match_dup 1)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
378 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
379 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
380 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
381 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
382 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
383 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
384 (match_dup 3)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
385
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
386 ;; The SImode version of the previous pattern.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
387
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
388 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
389 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
390 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
391 (match_operand 1 "incdec_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
392 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
393 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
394 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
395 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
396 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
397 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
398 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
399 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
400 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
401 (unspec:SI [(match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
402 (match_dup 1)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
403 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
404 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
405 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
406 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
407 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
408 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
409 (match_dup 3)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
410
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
411 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
412 [(parallel [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
413 (compare (zero_extract:SI (match_operand:QI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
414 (const_int 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
415 (const_int 7))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
416 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
417 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
418 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
419 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
420 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
421 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
422 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
423 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
424 [(set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
425 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
426 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
427 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
428 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
429 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
430 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
431 operands[4] = ((GET_CODE (operands[4]) == EQ)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
432 ? gen_rtx_GE (VOIDmode, cc0_rtx, const0_rtx)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
433 : gen_rtx_LT (VOIDmode, cc0_rtx, const0_rtx));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
434 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
435
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
436 ;; The next three peephole2's will try to transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
437 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
438 ;; mov.b A,r0l (or mov.l A,er0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
439 ;; and.l #CST,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
440 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
441 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
442 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
443 ;; sub.l er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
444 ;; mov.b A,r0l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
445 ;; and.b #CST,r0l (if CST is not 255)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
446
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
447 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
448 [(set (match_operand:QI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
449 (match_operand:QI 1 "general_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
450 (set (match_operand:SI 2 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
451 (and:SI (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
452 (const_int 255)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
453 "!reg_overlap_mentioned_p (operands[2], operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
454 && REGNO (operands[0]) == REGNO (operands[2])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
455 [(set (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
456 (const_int 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
457 (set (strict_low_part (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
458 (match_dup 1))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
459 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
460
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
461 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
462 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
463 (match_operand:SI 1 "nonimmediate_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
464 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
465 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
466 (const_int 255)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
467 "!reg_overlap_mentioned_p (operands[0], operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
468 && !(GET_CODE (operands[1]) == MEM && !offsettable_memref_p (operands[1]))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
469 && !(GET_CODE (operands[1]) == MEM && MEM_VOLATILE_P (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
470 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
471 (const_int 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
472 (set (strict_low_part (match_dup 2))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
473 (match_dup 3))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
474 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
475 operands[2] = gen_lowpart (QImode, operands[0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
476 operands[3] = gen_lowpart (QImode, operands[1]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
477 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
478
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
479 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
480 [(set (match_operand 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
481 (match_operand 1 "nonimmediate_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
482 (set (match_operand:SI 2 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
483 (and:SI (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
484 (match_operand:SI 3 "const_int_qi_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
485 "(GET_MODE (operands[0]) == QImode
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
486 || GET_MODE (operands[0]) == HImode
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
487 || GET_MODE (operands[0]) == SImode)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
488 && GET_MODE (operands[0]) == GET_MODE (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
489 && REGNO (operands[0]) == REGNO (operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
490 && !reg_overlap_mentioned_p (operands[2], operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
491 && !(GET_MODE (operands[1]) != QImode
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
492 && GET_CODE (operands[1]) == MEM
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
493 && !offsettable_memref_p (operands[1]))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
494 && !(GET_MODE (operands[1]) != QImode
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
495 && GET_CODE (operands[1]) == MEM
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
496 && MEM_VOLATILE_P (operands[1]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
497 [(set (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
498 (const_int 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
499 (set (strict_low_part (match_dup 4))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
500 (match_dup 5))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
501 (set (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
502 (and:SI (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
503 (match_dup 6)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
504 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
505 operands[4] = gen_lowpart (QImode, operands[0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
506 operands[5] = gen_lowpart (QImode, operands[1]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
507 operands[6] = GEN_INT (~0xff | INTVAL (operands[3]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
508 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
509
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
510 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
511 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
512 (match_operand:SI 1 "register_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
513 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
514 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
515 (const_int 65280)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
516 "!reg_overlap_mentioned_p (operands[0], operands[1])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
517 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
518 (const_int 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
519 (set (zero_extract:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
520 (const_int 8)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
521 (const_int 8))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
522 (lshiftrt:SI (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
523 (const_int 8)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
524 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
525
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
526 ;; If a load of mem:SI is followed by an AND that turns off the upper
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
527 ;; half, then we can load mem:HI instead.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
528
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
529 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
530 [(set (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
531 (match_operand:SI 1 "memory_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
532 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
533 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
534 (match_operand:SI 2 "const_int_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
535 "!MEM_VOLATILE_P (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
536 && offsettable_memref_p (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
537 && (INTVAL (operands[2]) & ~0xffff) == 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
538 && INTVAL (operands[2]) != 255"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
539 [(set (match_dup 3)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
540 (match_dup 4))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
541 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
542 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
543 (match_dup 2)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
544 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
545 operands[3] = gen_lowpart (HImode, operands[0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
546 operands[4] = gen_lowpart (HImode, operands[1]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
547 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
548
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
549 ;; Convert a memory comparison to a move if there is a scratch register.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
550
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
551 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
552 [(match_scratch:QHSI 1 "r")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
553 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
554 (compare (match_operand:QHSI 0 "memory_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
555 (const_int 0)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
556 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
557 [(set (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
558 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
559 (set (cc0) (compare (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
560 (const_int 0)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
561 "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
562
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
563 ;; (compare (reg:HI) (const_int)) takes 4 bytes, so we try to achieve
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
564 ;; the equivalent with shorter sequences. Here is the summary. Cases
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
565 ;; are grouped for each define_peephole2.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
566 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
567 ;; reg const_int use insn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
568 ;; --------------------------------------------------------
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
569 ;; dead -2 eq/ne inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
570 ;; dead -1 eq/ne inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
571 ;; dead 1 eq/ne dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
572 ;; dead 2 eq/ne dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
573 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
574 ;; dead 1 ge/lt shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
575 ;; dead 3 (H8S) ge/lt shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
576 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
577 ;; dead 1 geu/ltu shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
578 ;; dead 3 (H8S) geu/ltu shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
579 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
580 ;; ---- 255 ge/lt mov.b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
581 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
582 ;; ---- 255 geu/ltu mov.b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
583
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
584 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
585 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
586 ;; cmp.w #1,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
587 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
588 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
589 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
590 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
591 ;; dec.w #1,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
592 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
593
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
594 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
595 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
596 (compare (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
597 (match_operand:HI 1 "incdec_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
598 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
599 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
600 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
601 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
602 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
603 "INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
604 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
605 (unspec:HI [(match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
606 (match_dup 5)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
607 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
608 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
609 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
610 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
611 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
612 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
613 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
614 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
615 operands[5] = GEN_INT (- INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
616 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
617
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
618 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
619 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
620 ;; cmp.w #1,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
621 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
622 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
623 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
624 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
625 ;; shar.w r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
626 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
627
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
628 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
629 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
630 (compare (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
631 (match_operand:HI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
632 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
633 (if_then_else (match_operator 4 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
634 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
635 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
636 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
637 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
638 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
639 || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
640 [(parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
641 (ashiftrt:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
642 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
643 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
644 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
645 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
646 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
647 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
648 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
649 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
650 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
651 operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
652 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
653
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
654 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
655 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
656 ;; cmp.w #1,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
657 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
658 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
659 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
660 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
661 ;; shar.w r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
662 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
663
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
664 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
665 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
666 (compare (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
667 (match_operand:HI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
668 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
669 (if_then_else (match_operator 4 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
670 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
671 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
672 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
673 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
674 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
675 || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
676 [(parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
677 (ashiftrt:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
678 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
679 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
680 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
681 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
682 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
683 (if_then_else (match_dup 6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
684 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
685 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
686 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
687 operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
688 operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
689 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
690 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
691
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
692 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
693 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
694 ;; cmp.w #255,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
695 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
696 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
697 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
698 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
699 ;; mov.b r0h,r0h
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
700 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
701
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
702 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
703 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
704 (compare (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
705 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
706 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
707 (if_then_else (match_operator 1 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
708 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
709 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
710 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
711 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
712 [(set (cc0) (compare (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
713 (const_int -256))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
714 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
715 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
716 (if_then_else (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
717 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
718 (match_dup 3)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
719
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
720 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
721 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
722 ;; cmp.w #255,r0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
723 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
724 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
725 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
726 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
727 ;; mov.b r0h,r0h
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
728 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
729
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
730 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
731 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
732 (compare (match_operand:HI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
733 (const_int 255)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
734 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
735 (if_then_else (match_operator 1 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
736 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
737 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
738 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
739 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
740 [(set (cc0) (compare (and:HI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
741 (const_int -256))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
742 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
743 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
744 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
745 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
746 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
747 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
748 operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
749 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
750 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
751
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
752 ;; (compare (reg:SI) (const_int)) takes 6 bytes, so we try to achieve
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
753 ;; the equivalent with shorter sequences. Here is the summary. Cases
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
754 ;; are grouped for each define_peephole2.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
755 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
756 ;; reg const_int use insn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
757 ;; --------------------------------------------------------
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
758 ;; live -2 eq/ne copy and inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
759 ;; live -1 eq/ne copy and inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
760 ;; live 1 eq/ne copy and dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
761 ;; live 2 eq/ne copy and dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
762 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
763 ;; dead -2 eq/ne inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
764 ;; dead -1 eq/ne inc.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
765 ;; dead 1 eq/ne dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
766 ;; dead 2 eq/ne dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
767 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
768 ;; dead -131072 eq/ne inc.w and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
769 ;; dead -65536 eq/ne inc.w and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
770 ;; dead 65536 eq/ne dec.w and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
771 ;; dead 131072 eq/ne dec.w and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
772 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
773 ;; dead 0x000000?? except 1 and 2 eq/ne xor.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
774 ;; dead 0x0000??00 eq/ne xor.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
775 ;; dead 0x0000ffff eq/ne not.w and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
776 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
777 ;; dead 0xffffff?? except -1 and -2 eq/ne xor.b and not.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
778 ;; dead 0xffff??ff eq/ne xor.b and not.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
779 ;; dead 0x40000000 (H8S) eq/ne rotl.l and dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
780 ;; dead 0x80000000 eq/ne rotl.l and dec.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
781 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
782 ;; live 1 ge/lt copy and shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
783 ;; live 3 (H8S) ge/lt copy and shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
784 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
785 ;; live 1 geu/ltu copy and shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
786 ;; live 3 (H8S) geu/ltu copy and shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
787 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
788 ;; dead 1 ge/lt shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
789 ;; dead 3 (H8S) ge/lt shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
790 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
791 ;; dead 1 geu/ltu shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
792 ;; dead 3 (H8S) geu/ltu shar.l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
793 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
794 ;; dead 3 (H8/300H) ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
795 ;; dead 7 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
796 ;; dead 15 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
797 ;; dead 31 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
798 ;; dead 63 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
799 ;; dead 127 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
800 ;; dead 255 ge/lt and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
801 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
802 ;; dead 3 (H8/300H) geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
803 ;; dead 7 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
804 ;; dead 15 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
805 ;; dead 31 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
806 ;; dead 63 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
807 ;; dead 127 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
808 ;; dead 255 geu/ltu and.b and test
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
809 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
810 ;; ---- 65535 ge/lt mov.w
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
811 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
812 ;; ---- 65535 geu/ltu mov.w
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
813
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
814 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
815 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
816 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
817 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
818 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
819 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
820 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
821 ;; dec.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
822 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
823
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
824 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
825 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
826 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
827 (match_operand:SI 1 "incdec_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
828 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
829 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
830 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
831 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
832 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
833 "INTVAL (operands[1]) != 0 && peep2_reg_dead_p (1, operands[0])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
834 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
835 (unspec:SI [(match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
836 (match_dup 5)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
837 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
838 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
839 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
840 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
841 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
842 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
843 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
844 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
845 operands[5] = GEN_INT (- INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
846 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
847
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
848 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
849 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
850 ;; cmp.l #65536,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
851 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
852 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
853 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
854 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
855 ;; dec.l #1,e0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
856 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
857
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
858 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
859 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
860 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
861 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
862 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
863 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
864 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
865 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
866 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
867 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
868 && (INTVAL (operands[1]) == -131072
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
869 || INTVAL (operands[1]) == -65536
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
870 || INTVAL (operands[1]) == 65536
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
871 || INTVAL (operands[1]) == 131072)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
872 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
873 (plus:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
874 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
875 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
876 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
877 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
878 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
879 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
880 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
881 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
882 operands[5] = GEN_INT (- INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
883 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
884
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
885 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
886 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
887 ;; cmp.l #100,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
888 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
889 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
890 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
891 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
892 ;; xor.b #100,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
893 ;; mov.l er0,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
894 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
895
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
896 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
897 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
898 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
899 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
900 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
901 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
902 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
903 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
904 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
905 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
906 && ((INTVAL (operands[1]) & 0x00ff) == INTVAL (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
907 || (INTVAL (operands[1]) & 0xff00) == INTVAL (operands[1])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
908 || INTVAL (operands[1]) == 0x0000ffff)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
909 && INTVAL (operands[1]) != 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
910 && INTVAL (operands[1]) != 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
911 && INTVAL (operands[1]) != 2"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
912 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
913 (xor:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
914 (match_dup 1)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
915 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
916 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
917 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
918 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
919 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
920 (match_dup 3)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
921
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
922 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
923 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
924 ;; cmp.l #-100,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
925 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
926 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
927 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
928 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
929 ;; xor.b #99,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
930 ;; not.l er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
931 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
932
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
933 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
934 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
935 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
936 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
937 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
938 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
939 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
940 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
941 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
942 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
943 && ((INTVAL (operands[1]) | 0x00ff) == -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
944 || (INTVAL (operands[1]) | 0xff00) == -1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
945 && INTVAL (operands[1]) != -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
946 && INTVAL (operands[1]) != -2"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
947 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
948 (xor:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
949 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
950 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
951 (not:SI (match_dup 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
952 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
953 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
954 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
955 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
956 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
957 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
958 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
959 operands[5] = GEN_INT (INTVAL (operands[1]) ^ -1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
960 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
961
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
962 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
963 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
964 ;; cmp.l #-2147483648,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
965 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
966 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
967 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
968 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
969 ;; rotl.l er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
970 ;; dec.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
971 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
972
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
973 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
974 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
975 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
976 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
977 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
978 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
979 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
980 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
981 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
982 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
983 && (INTVAL (operands[1]) == -2147483647 - 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
984 || (TARGET_H8300S && INTVAL (operands[1]) == 1073741824))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
985 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
986 (rotate:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
987 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
988 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
989 (unspec:SI [(match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
990 (const_int -1)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
991 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
992 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
993 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
994 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
995 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
996 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
997 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
998 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
999 operands[5] = GEN_INT (INTVAL (operands[1]) == -2147483647 - 1 ? 1 : 2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1000 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1001
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1002 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1003 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1004 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1005 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1006 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1007 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1008 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1009 ;; mov.l er0,er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1010 ;; shar.l er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1011 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1012
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1013 ;; We avoid this transformation if we see more than one copy of the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1014 ;; same compare insn immediately before this one.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1015
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1016 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1017 [(match_scratch:SI 5 "r")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1018 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1019 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1020 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1021 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1022 (if_then_else (match_operator 4 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1023 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1024 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1025 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1026 "!peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1027 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1028 || (TARGET_H8300S && INTVAL (operands[1]) == 3))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1029 && !same_cmp_preceding_p (insn)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1030 [(set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1031 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1032 (parallel [(set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1033 (ashiftrt:SI (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1034 (match_dup 6)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1035 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1036 (set (cc0) (compare (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1037 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1038 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1039 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1040 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1041 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1042 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1043 operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1044 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1045
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1046 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1047 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1048 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1049 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1050 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1051 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1052 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1053 ;; mov.l er0,er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1054 ;; shar.l er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1055 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1056
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1057 ;; We avoid this transformation if we see more than one copy of the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1058 ;; same compare insn immediately before this one.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1059
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1060 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1061 [(match_scratch:SI 5 "r")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1062 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1063 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1064 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1065 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1066 (if_then_else (match_operator 4 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1067 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1068 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1069 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1070 "!peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1071 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1072 || (TARGET_H8300S && INTVAL (operands[1]) == 3))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1073 && !same_cmp_preceding_p (insn)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1074 [(set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1075 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1076 (parallel [(set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1077 (ashiftrt:SI (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1078 (match_dup 6)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1079 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1080 (set (cc0) (compare (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1081 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1082 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1083 (if_then_else (match_dup 7)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1084 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1085 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1086 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1087 operands[6] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1088 operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1089 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1090 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1091
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1092 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1093 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1094 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1095 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1096 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1097 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1098 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1099 ;; shar.l er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1100 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1101
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1102 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1103 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1104 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1105 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1106 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1107 (if_then_else (match_operator 4 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1108 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1109 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1110 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1111 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1112 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1113 || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1114 [(parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1115 (ashiftrt:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1116 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1117 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1118 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1119 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1120 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1121 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1122 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1123 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1124 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1125 operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1126 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1127
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1128 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1129 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1130 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1131 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1132 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1133 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1134 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1135 ;; shar.l er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1136 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1137
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1138 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1139 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1140 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1141 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1142 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1143 (if_then_else (match_operator 4 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1144 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1145 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1146 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1147 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1148 && (INTVAL (operands[1]) == 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1149 || (TARGET_H8300S && INTVAL (operands[1]) == 3))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1150 [(parallel [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1151 (ashiftrt:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1152 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1153 (clobber (scratch:QI))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1154 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1155 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1156 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1157 (if_then_else (match_dup 6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1158 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1159 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1160 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1161 operands[5] = GEN_INT (exact_log2 (INTVAL (operands[1]) + 1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1162 operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1163 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1164 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1165
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1166 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1167 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1168 ;; cmp.l #15,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1169 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1170 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1171 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1172 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1173 ;; and #240,r0l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1174 ;; mov.l er0,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1175 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1176
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1177 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1178 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1179 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1180 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1181 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1182 (if_then_else (match_operator 4 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1183 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1184 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1185 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1186 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1187 && (INTVAL (operands[1]) == 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1188 || INTVAL (operands[1]) == 7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1189 || INTVAL (operands[1]) == 15
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1190 || INTVAL (operands[1]) == 31
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1191 || INTVAL (operands[1]) == 63
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1192 || INTVAL (operands[1]) == 127
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1193 || INTVAL (operands[1]) == 255)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1194 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1195 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1196 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1197 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1198 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1199 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1200 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1201 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1202 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1203 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1204 operands[5] = GEN_INT (~INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1205 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1206
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1207 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1208 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1209 ;; cmp.l #15,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1210 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1211 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1212 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1213 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1214 ;; and #240,r0l
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1215 ;; mov.l er0,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1216 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1217
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1218 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1219 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1220 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1221 (match_operand:SI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1222 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1223 (if_then_else (match_operator 4 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1224 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1225 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1226 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1227 "peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1228 && ((TARGET_H8300H && INTVAL (operands[1]) == 3)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1229 || INTVAL (operands[1]) == 7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1230 || INTVAL (operands[1]) == 15
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1231 || INTVAL (operands[1]) == 31
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1232 || INTVAL (operands[1]) == 63
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1233 || INTVAL (operands[1]) == 127
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1234 || INTVAL (operands[1]) == 255)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1235 [(set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1236 (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1237 (match_dup 5)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1238 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1239 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1240 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1241 (if_then_else (match_dup 6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1242 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1243 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1244 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1245 operands[5] = GEN_INT (~INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1246 operands[6] = gen_rtx_fmt_ee (GET_CODE (operands[4]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1247 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1248 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1249
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1250 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1251 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1252 ;; cmp.l #65535,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1253 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1254 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1255 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1256 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1257 ;; mov.l e0,e0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1258 ;; bgt .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1259
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1260 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1261 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1262 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1263 (const_int 65535)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1264 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1265 (if_then_else (match_operator 1 "gtle_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1266 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1267 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1268 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1269 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1270 [(set (cc0) (compare (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1271 (const_int -65536))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1272 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1273 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1274 (if_then_else (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1275 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1276 (match_dup 3)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1277
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1278 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1279 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1280 ;; cmp.l #65535,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1281 ;; bhi .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1282 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1283 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1284 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1285 ;; mov.l e0,e0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1286 ;; bne .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1287
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1288 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1289 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1290 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1291 (const_int 65535)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1292 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1293 (if_then_else (match_operator 1 "gtuleu_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1294 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1295 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1296 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1297 ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1298 [(set (cc0) (compare (and:SI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1299 (const_int -65536))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1300 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1301 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1302 (if_then_else (match_dup 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1303 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1304 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1305 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1306 operands[4] = gen_rtx_fmt_ee (GET_CODE (operands[1]) == GTU ? NE : EQ,
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1307 VOIDmode, cc0_rtx, const0_rtx);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1308 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1309
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1310 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1311 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1312 ;; cmp.l #1,er0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1313 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1314 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1315 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1316 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1317 ;; mov.l er0,er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1318 ;; dec.l #1,er1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1319 ;; beq .L1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1320
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1321 ;; We avoid this transformation if we see more than one copy of the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1322 ;; same compare insn.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1323
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1324 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1325 [(match_scratch:SI 5 "r")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1326 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1327 (compare (match_operand:SI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1328 (match_operand:SI 1 "incdec_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1329 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1330 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1331 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1332 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1333 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1334 "INTVAL (operands[1]) != 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1335 && !peep2_reg_dead_p (1, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1336 && !same_cmp_following_p (insn)"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1337 [(set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1338 (match_dup 0))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1339 (set (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1340 (unspec:SI [(match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1341 (match_dup 6)]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1342 UNSPEC_INCDEC))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1343 (set (cc0) (compare (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1344 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1345 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1346 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1347 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1348 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1349 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1350 operands[6] = GEN_INT (- INTVAL (operands[1]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1351 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1352
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1353 ;; Narrow the mode of testing if possible.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1354
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1355 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1356 [(set (match_operand:HSI 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1357 (and:HSI (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1358 (match_operand:HSI 1 "const_int_operand" "")))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1359 (set (cc0) (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1360 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1361 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1362 (if_then_else (match_operator 4 "eqne_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1363 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1364 (match_operand 2 "pc_or_label_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1365 (match_operand 3 "pc_or_label_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1366 "((const_int_qi_operand (operands[1], QImode)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1367 || (GET_MODE (operands[0]) == SImode
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1368 && const_int_hi_operand (operands[1], HImode)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1369 && peep2_reg_dead_p (2, operands[0]))"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1370 [(set (match_dup 5) (match_dup 7))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1371 (set (cc0) (compare (match_dup 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1372 (const_int 0)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1373 (set (pc)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1374 (if_then_else (match_op_dup 4 [(cc0) (const_int 0)])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1375 (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1376 (match_dup 3)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1377 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1378 enum machine_mode mode;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1379
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1380 mode = const_int_qi_operand (operands[1], QImode) ? QImode : HImode;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1381 operands[5] = gen_rtx_REG (mode, REGNO (operands[0]));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1382 operands[6] = gen_int_mode (INTVAL (operands[1]), mode);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1383 operands[7] = gen_rtx_AND (mode, operands[5], operands[6]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1384 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1385
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1386 ;; These triggers right at the end of allocation of locals in the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1387 ;; prologue (and possibly at other places).
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1388
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1389 ;; stack adjustment of -4, generate one push
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1390 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1391 ;; before : 6 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1392 ;; after : 4 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1393
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1394 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1395 [(set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1396 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1397 (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1398 (set (mem:SFI (reg:SI SP_REG))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1399 (match_operand:SFI 0 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1400 "!TARGET_NORMAL_MODE && REGNO (operands[0]) != SP_REG"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1401 [(set (mem:SFI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1402 (match_dup 0))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1403
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1404 ;; stack adjustment of -8, generate one push
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1405 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1406 ;; before : 8 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1407 ;; after : 6 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1408
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1409 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1410 [(set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1411 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1412 (const_int -8)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1413 (set (mem:SFI (reg:SI SP_REG))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1414 (match_operand:SFI 0 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1415 "!TARGET_NORMAL_MODE && REGNO (operands[0]) != SP_REG"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1416 [(set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1417 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1418 (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1419 (set (mem:SFI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1420 (match_dup 0))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1421
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1422 ;; stack adjustment of -12, generate one push
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1423 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1424 ;; before : 10 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1425 ;; after : 8 bytes
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1426
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1427 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1428 [(set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1429 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1430 (const_int -12)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1431 (set (mem:SFI (reg:SI SP_REG))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1432 (match_operand:SFI 0 "register_operand" ""))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1433 "!TARGET_NORMAL_MODE && REGNO (operands[0]) != SP_REG"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1434 [(set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1435 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1436 (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1437 (set (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1438 (plus:SI (reg:SI SP_REG)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1439 (const_int -4)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1440 (set (mem:SFI (pre_dec:SI (reg:SI SP_REG)))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1441 (match_dup 0))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1442
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1443 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1444 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1445 ;; mov dst,reg
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1446 ;; op reg
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1447 ;; mov reg,dst
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1448 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1449 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1450 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1451 ;; op dst
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1452 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1453 ;; if "reg" dies at the end of the sequence.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1454
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1455 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1456 [(set (match_operand 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1457 (match_operand 1 "memory_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1458 (set (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1459 (match_operator 2 "h8sx_unary_memory_operator"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1460 [(match_dup 0)]))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1461 (set (match_operand 3 "memory_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1462 (match_dup 0))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1463 "TARGET_H8300SX
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1464 && peep2_reg_dead_p (3, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1465 && !reg_overlap_mentioned_p (operands[0], operands[3])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1466 && h8sx_mergeable_memrefs_p (operands[3], operands[1])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1467 [(set (match_dup 3)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1468 (match_dup 4))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1469 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1470 operands[4] = shallow_copy_rtx (operands[2]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1471 XEXP (operands[4], 0) = operands[1];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1472 })
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1473
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1474 ;; Transform
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1475 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1476 ;; mov src1,reg
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1477 ;; cmp reg,src2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1478 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1479 ;; into
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1480 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1481 ;; cmp src1,src2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1482 ;;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1483 ;; if "reg" dies in the comparison.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1484
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1485 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1486 [(set (match_operand 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1487 (match_operand 1 "h8300_dst_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1488 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1489 (compare (match_dup 0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1490 (match_operand 2 "h8300_src_operand" "")))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1491 "TARGET_H8300SX
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1492 && peep2_reg_dead_p (2, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1493 && !reg_overlap_mentioned_p (operands[0], operands[2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1494 && operands[2] != const0_rtx"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1495 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1496 (compare (match_dup 1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1497 (match_dup 2)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1498
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1499 ;; Likewise for the second operand.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1500
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1501 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1502 [(set (match_operand 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1503 (match_operand 1 "h8300_src_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1504 (set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1505 (compare (match_operand 2 "h8300_dst_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1506 (match_dup 0)))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1507 "TARGET_H8300SX
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1508 && peep2_reg_dead_p (2, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1509 && !reg_overlap_mentioned_p (operands[0], operands[2])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1510 [(set (cc0)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1511 (compare (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1512 (match_dup 1)))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1513
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1514 ;; Combine two moves.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1515
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1516 (define_peephole2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1517 [(set (match_operand 0 "register_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1518 (match_operand 1 "h8300_src_operand" ""))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1519 (set (match_operand 2 "h8300_dst_operand" "")
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1520 (match_dup 0))]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1521 "TARGET_H8300SX
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1522 && peep2_reg_dead_p (2, operands[0])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1523 && !reg_overlap_mentioned_p (operands[0], operands[2])"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1524 [(set (match_dup 2)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1525 (match_dup 1))])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1526
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1527