comparison gcc/config/h8300/movepush.md @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
comparison
equal deleted inserted replaced
145:1830386684a0 152:2b5abeee2509
1 ;; ----------------------------------------------------------------------
2 ;; MOVE INSTRUCTIONS
3 ;; ----------------------------------------------------------------------
4
5 ;; movqi
6
7 (define_insn "*movqi_h8nosx"
8 [(set (match_operand:QI 0 "general_operand_dst" "=r,r ,<,r,r,m")
9 (match_operand:QI 1 "general_operand_src" " I,r>,r,n,m,r"))]
10 "!TARGET_H8300SX
11 && h8300_move_ok (operands[0], operands[1])"
12 "@
13 sub.b %X0,%X0
14 mov.b %R1,%X0
15 mov.b %X1,%R0
16 mov.b %R1,%X0
17 mov.b %R1,%X0
18 mov.b %X1,%R0"
19 [(set (attr "length")
20 (symbol_ref "compute_mov_length (operands)"))
21 (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
22
23 (define_insn "*movqi_h8sx"
24 [(set (match_operand:QI 0 "general_operand_dst" "=Z,rQ")
25 (match_operand:QI 1 "general_operand_src" "P4>X,rQi"))]
26 "TARGET_H8300SX"
27 "@
28 mov.b %X1:4,%X0
29 mov.b %X1,%X0"
30 [(set_attr "length_table" "mov_imm4,movb")
31 (set_attr "cc" "set_znv")])
32
33 (define_expand "mov<mode>"
34 [(set (match_operand:QHSIF 0 "general_operand_dst" "")
35 (match_operand:QHSIF 1 "general_operand_src" ""))]
36 ""
37 {
38 enum machine_mode mode = <MODE>mode;
39 if (!TARGET_H8300SX)
40 {
41 /* Other H8 chips, except the H8/SX family can only handle a
42 single memory operand, which is checked by h8300_move_ok.
43
44 We could perhaps have h8300_move_ok handle the H8/SX better
45 and just remove the !TARGET_H8300SX conditional. */
46 if (!h8300_move_ok (operands[0], operands[1]))
47 operands[1] = copy_to_mode_reg (mode, operand1);
48 }
49 })
50
51 (define_insn "movstrictqi"
52 [(set (strict_low_part (match_operand:QI 0 "general_operand_dst" "+r,r"))
53 (match_operand:QI 1 "general_operand_src" "I,rmi>"))]
54 ""
55 "@
56 sub.b %X0,%X0
57 mov.b %X1,%X0"
58 [(set_attr "length" "2,*")
59 (set_attr "length_table" "*,movb")
60 (set_attr "cc" "set_zn,set_znv")])
61
62 ;; movhi
63
64 (define_insn "*movhi_h8nosx"
65 [(set (match_operand:HI 0 "general_operand_dst" "=r,r,<,r,r,m")
66 (match_operand:HI 1 "general_operand_src" "I,r>,r,i,m,r"))]
67 "!TARGET_H8300SX
68 && h8300_move_ok (operands[0], operands[1])"
69 "@
70 sub.w %T0,%T0
71 mov.w %T1,%T0
72 mov.w %T1,%T0
73 mov.w %T1,%T0
74 mov.w %T1,%T0
75 mov.w %T1,%T0"
76 [(set (attr "length")
77 (symbol_ref "compute_mov_length (operands)"))
78 (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
79
80 (define_insn "*movhi_h8sx"
81 [(set (match_operand:HI 0 "general_operand_dst" "=r,r,Z,Q,rQ")
82 (match_operand:HI 1 "general_operand_src" "I,P3>X,P4>X,IP8>X,rQi"))]
83 "TARGET_H8300SX"
84 "@
85 sub.w %T0,%T0
86 mov.w %T1:3,%T0
87 mov.w %T1:4,%T0
88 mov.w %T1,%T0
89 mov.w %T1,%T0"
90 [(set_attr "length_table" "*,*,mov_imm4,short_immediate,movw")
91 (set_attr "length" "2,2,*,*,*")
92 (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv")])
93
94 (define_insn "movstricthi"
95 [(set (strict_low_part (match_operand:HI 0 "general_operand_dst" "+r,r,r"))
96 (match_operand:HI 1 "general_operand_src" "I,P3>X,rmi"))]
97 ""
98 "@
99 sub.w %T0,%T0
100 mov.w %T1,%T0
101 mov.w %T1,%T0"
102 [(set_attr "length" "2,2,*")
103 (set_attr "length_table" "*,*,movw")
104 (set_attr "cc" "set_zn,set_znv,set_znv")])
105
106 ;; movsi
107 (define_insn "*movsi_h8300hs"
108 [(set (match_operand:SI 0 "general_operand_dst" "=r,r,r,<,r,r,m,*a,*a,r")
109 (match_operand:SI 1 "general_operand_src" "I,r,i,r,>,m,r,I,r,*a"))]
110 "(TARGET_H8300S || TARGET_H8300H) && !TARGET_H8300SX
111 && h8300_move_ok (operands[0], operands[1])"
112 {
113 switch (which_alternative)
114 {
115 case 0:
116 return "sub.l %S0,%S0";
117 case 7:
118 return "clrmac";
119 case 8:
120 return "clrmac\;ldmac %1,macl";
121 case 9:
122 return "stmac macl,%0";
123 default:
124 if (GET_CODE (operands[1]) == CONST_INT)
125 {
126 int val = INTVAL (operands[1]);
127
128 /* Look for constants which can be made by adding an 8-bit
129 number to zero in one of the two low bytes. */
130 if (val == (val & 0xff))
131 {
132 operands[1] = GEN_INT ((char) val & 0xff);
133 return "sub.l\\t%S0,%S0\;add.b\\t%1,%w0";
134 }
135
136 if (val == (val & 0xff00))
137 {
138 operands[1] = GEN_INT ((char) (val >> 8) & 0xff);
139 return "sub.l\\t%S0,%S0\;add.b\\t%1,%x0";
140 }
141
142 /* Look for constants that can be obtained by subs, inc, and
143 dec to 0. */
144 switch (val & 0xffffffff)
145 {
146 case 0xffffffff:
147 return "sub.l\\t%S0,%S0\;subs\\t#1,%S0";
148 case 0xfffffffe:
149 return "sub.l\\t%S0,%S0\;subs\\t#2,%S0";
150 case 0xfffffffc:
151 return "sub.l\\t%S0,%S0\;subs\\t#4,%S0";
152
153 case 0x0000ffff:
154 return "sub.l\\t%S0,%S0\;dec.w\\t#1,%f0";
155 case 0x0000fffe:
156 return "sub.l\\t%S0,%S0\;dec.w\\t#2,%f0";
157
158 case 0xffff0000:
159 return "sub.l\\t%S0,%S0\;dec.w\\t#1,%e0";
160 case 0xfffe0000:
161 return "sub.l\\t%S0,%S0\;dec.w\\t#2,%e0";
162
163 case 0x00010000:
164 return "sub.l\\t%S0,%S0\;inc.w\\t#1,%e0";
165 case 0x00020000:
166 return "sub.l\\t%S0,%S0\;inc.w\\t#2,%e0";
167 }
168 }
169 }
170 return "mov.l %S1,%S0";
171 }
172 [(set (attr "length")
173 (symbol_ref "compute_mov_length (operands)"))
174 (set_attr "cc" "set_zn,set_znv,clobber,set_znv,set_znv,set_znv,set_znv,none_0hit,none_0hit,set_znv")])
175
176 (define_insn "*movsi_h8sx"
177 [(set (match_operand:SI 0 "general_operand_dst" "=r,r,Q,rQ,*a,*a,r")
178 (match_operand:SI 1 "general_operand_src" "I,P3>X,IP8>X,rQi,I,r,*a"))]
179 "TARGET_H8300SX"
180 "@
181 sub.l %S0,%S0
182 mov.l %S1:3,%S0
183 mov.l %S1,%S0
184 mov.l %S1,%S0
185 clrmac
186 clrmac\;ldmac %1,macl
187 stmac macl,%0"
188 [(set_attr "length_table" "*,*,short_immediate,movl,*,*,*")
189 (set_attr "length" "2,2,*,*,2,6,4")
190 (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,none_0hit,none_0hit,set_znv")])
191
192 (define_insn "*movsf_h8sx"
193 [(set (match_operand:SF 0 "general_operand_dst" "=r,rQ")
194 (match_operand:SF 1 "general_operand_src" "G,rQi"))]
195 "TARGET_H8300SX"
196 "@
197 sub.l %S0,%S0
198 mov.l %S1,%S0"
199 [(set_attr "length" "2,*")
200 (set_attr "length_table" "*,movl")
201 (set_attr "cc" "set_zn,set_znv")])
202
203 (define_insn "*movsf_h8300hs"
204 [(set (match_operand:SF 0 "general_operand_dst" "=r,r,r,m,<,r")
205 (match_operand:SF 1 "general_operand_src" "G,r,im,r,r,>"))]
206 "!TARGET_H8300SX
207 && (register_operand (operands[0], SFmode)
208 || register_operand (operands[1], SFmode))"
209 "@
210 sub.l %S0,%S0
211 mov.l %S1,%S0
212 mov.l %S1,%S0
213 mov.l %S1,%S0
214 mov.l %S1,%S0
215 mov.l %S1,%S0"
216 [(set (attr "length")
217 (symbol_ref "compute_mov_length (operands)"))
218 (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
219
220 ;; ----------------------------------------------------------------------
221 ;; PUSH INSTRUCTIONS
222 ;; ----------------------------------------------------------------------
223
224 (define_insn "*push1_h8300hs_<QHI:mode>"
225 [(set (mem:QHI
226 (pre_modify:P
227 (reg:P SP_REG)
228 (plus:P (reg:P SP_REG) (const_int -4))))
229 (match_operand:QHI 0 "register_no_sp_elim_operand" "r"))]
230 ""
231 "mov.l\\t%S0,@-er7"
232 [(set_attr "length" "4")])
233