testsuite: Correct vec-rlmi-rlnm.c testsuite expected result
[official-gcc.git] / gcc / config / h8300 / movepush.md
bloba8241b90a45ea0f4e65d0820200701af15d7b8d8
1 ;; ----------------------------------------------------------------------
2 ;; MOVE INSTRUCTIONS
3 ;; ----------------------------------------------------------------------
5 ;; movqi
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")])
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")])
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.
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   })
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")])
62 ;; movhi
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")])
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")])
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")])
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])"
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]);
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             }
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             }
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";
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";
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";
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";
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")])
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")])
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")])
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")])
220 ;; ----------------------------------------------------------------------
221 ;; PUSH INSTRUCTIONS
222 ;; ----------------------------------------------------------------------
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")])