xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/stormy16/stormy16.md (revision 80d9064ac03cbb6a4174695f0d5b237c8766d3d0)
1;; XSTORMY16 Machine description template
2;; Copyright (C) 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2008
3;; Free Software Foundation, Inc.
4;; Contributed by Red Hat, Inc.
5
6;; This file is part of GCC.
7
8;; GCC is free software; you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation; either version 3, or (at your option)
11;; any later version.
12
13;; GCC is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16;; GNU General Public License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with GCC; see the file COPYING3.  If not see
20;; <http://www.gnu.org/licenses/>.
21
22;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
23
24;; Constraints
25;; a  $0
26;; b  $1
27;; c  $2
28;; d  $8
29;; e  $0..$7
30;; t  $0..$1
31;; z  $8..$9
32;; I  0..3
33;; J  2**N mask
34;; K  2**N antimask
35;; L  0..255
36;; M  -255..0
37;; N  -3..0
38;; O  1..4
39;; P  -4..-1
40;; Q  post-inc mem (push)
41;; R  pre-dec mem (pop)
42;; S  immediate mem
43;; T  Rx
44;; U  -inf..1 or 16..inf
45;; Z  0
46
47(define_constants
48  [
49    (CARRY_REG 16)
50  ]
51)
52
53;; ::::::::::::::::::::
54;; ::
55;; :: Attributes
56;; ::
57;; ::::::::::::::::::::
58
59; Categorize branches for the conditional in the length attribute.
60(define_attr "branch_class" "notdirectbranch,br12,bcc12,bcc8p2,bcc8p4"
61    (const_string "notdirectbranch"))
62
63; The length of an instruction, used for branch shortening.
64(define_attr "length" ""
65  (cond
66   [(eq_attr "branch_class" "br12")
67     (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -2046))
68			(lt (minus (match_dup 0) (pc)) (const_int 2048)))
69		   (const_int 2)
70		   (const_int 4))
71    (eq_attr "branch_class" "bcc12")
72     (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -2044))
73			(lt (minus (match_dup 0) (pc)) (const_int 2048)))
74		   (const_int 4)
75		   (const_int 8))
76    (eq_attr "branch_class" "bcc8p2")
77     (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -124))
78			(lt (minus (match_dup 0) (pc)) (const_int 128)))
79		   (const_int 4)
80		   (const_int 8))
81    (eq_attr "branch_class" "bcc8p4")
82     (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -122))
83			(lt (minus (match_dup 0) (pc)) (const_int 128)))
84		   (const_int 6)
85		   (const_int 10))]
86   (const_int 2)))
87
88; The operand which determines the setting of Rpsw.
89; The numbers indicate the operand number,
90; 'clobber' indicates it is changed in some unspecified way
91; 'nop' means it is not changed.
92(define_attr "psw_operand" "clobber,nop,0,1,2,3,4" (const_string "0"))
93
94(define_asm_attributes [(set_attr "length" "4")
95			(set_attr "psw_operand" "clobber")])
96
97(include "predicates.md")
98
99;; ::::::::::::::::::::
100;; ::
101;; :: Moves
102;; ::
103;; ::::::::::::::::::::
104;; push/pop qi and hi are here as separate insns rather than part of
105;; the movqi/hi patterns because we need to ensure that reload isn't
106;; passed anything it can't cope with.  Without these patterns, we
107;; might end up with
108
109;; (set (mem (post_inc (sp))) mem (post_inc (reg)))
110
111;; If, in this example, reg needs reloading, reload will read reg from
112;; the stack , adjust sp, and store reg back at what is now the wrong
113;; offset.  By using separate patterns for push and pop we ensure that
114;; insns like this one are never generated.
115
116(define_insn "pushqi1"
117  [(set (mem:QI (post_inc (reg:HI 15)))
118	(match_operand:QI 0 "register_operand" "r"))]
119  ""
120  "push %0"
121  [(set_attr "psw_operand" "nop")
122   (set_attr "length" "2")])
123
124(define_insn "popqi1"
125  [(set (match_operand:QI 0 "register_operand" "=r")
126	(mem:QI (pre_dec (reg:HI 15))))]
127  ""
128  "pop %0"
129  [(set_attr "psw_operand" "nop")
130   (set_attr "length" "2")])
131
132(define_expand "movqi"
133  [(set (match_operand:QI 0 "nonimmediate_nonstack_operand" "")
134	(match_operand:QI 1 "general_operand" ""))]
135  ""
136  { xstormy16_expand_move (QImode, operands[0], operands[1]);
137    DONE;
138  })
139
140(define_insn "movqi_internal"
141  [(set (match_operand:QI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S,W,e")
142	(match_operand:QI 1 "general_operand"       "r,e,m,i,i,i,i,ie,W"))]
143  ""
144  "@
145   mov %0,%1
146   mov.b %0,%1
147   mov.b %0,%1
148   mov %0,%1
149   mov Rx,%1
150   mov %0,%1
151   mov.b %0,%1
152   mov.b %0,%1
153   mov.b %0,%1"
154  [(set_attr_alternative "length"
155	     [(const_int 2)
156	      (if_then_else (match_operand:QI 0 "short_memory_operand" "")
157			    (const_int 2)
158			    (const_int 4))
159	      (if_then_else (match_operand:QI 1 "short_memory_operand" "")
160			    (const_int 2)
161			    (const_int 4))
162	      (const_int 2)
163	      (const_int 2)
164	      (const_int 4)
165	      (const_int 4)
166	      (const_int 2)
167	      (const_int 2)])
168   (set_attr "psw_operand" "0,0,0,0,nop,0,nop,0,0")])
169
170(define_insn "pushhi1"
171  [(set (mem:HI (post_inc (reg:HI 15)))
172	(match_operand:HI 0 "register_operand" "r"))]
173  ""
174  "push %0"
175  [(set_attr "psw_operand" "nop")
176   (set_attr "length" "2")])
177
178(define_insn "pophi1"
179  [(set (match_operand:HI 0 "register_operand" "=r")
180	(mem:HI (pre_dec (reg:HI 15))))]
181  ""
182  "pop %0"
183  [(set_attr "psw_operand" "nop")
184   (set_attr "length" "2")])
185
186(define_expand "movhi"
187  [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "")
188	(match_operand:HI 1 "xs_hi_general_operand" ""))]
189  ""
190  { xstormy16_expand_move (HImode, operands[0], operands[1]);
191    DONE;
192  })
193
194(define_insn "movhi_internal"
195  [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S,W,e")
196	(match_operand:HI 1 "xs_hi_general_operand"          "r,e,m,L,L,i,i,ie,W"))]
197  ""
198  "@
199   mov %0,%1
200   mov.w %0,%1
201   mov.w %0,%1
202   mov.w %0,%1
203   mov.w Rx,%1
204   mov.w %0,%1
205   mov.w %0,%1
206   mov.w %0,%1
207   mov.w %0,%1"
208  [(set_attr_alternative "length"
209	     [(const_int 2)
210	      (if_then_else (match_operand:QI 0 "short_memory_operand" "")
211			    (const_int 2)
212			    (const_int 4))
213	      (if_then_else (match_operand:QI 1 "short_memory_operand" "")
214			    (const_int 2)
215			    (const_int 4))
216	      (const_int 2)
217	      (const_int 2)
218	      (const_int 4)
219	      (const_int 4)
220	      (const_int 4)
221	      (const_int 4)])
222   (set_attr "psw_operand" "0,0,0,0,nop,0,nop,0,0")])
223
224(define_expand "movsi"
225  [(set (match_operand:SI 0 "nonimmediate_operand" "")
226	(match_operand:SI 1 "general_operand" ""))]
227  ""
228  { xstormy16_expand_move (SImode, operands[0], operands[1]);
229    DONE;
230  })
231
232(define_insn_and_split "*movsi_internal"
233  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,Q,r,m,e,&e,e,r,S")
234	(match_operand:SI 1 "general_operand"       "r,r,R,e,o, V,L,i,i"))]
235  ""
236  "#"
237  "reload_completed"
238  [(pc)]
239  { xstormy16_split_move (SImode, operands[0], operands[1]);
240    DONE;
241  }
242  [(set_attr_alternative "length"
243	     [(const_int 4)
244	      (const_int 4)
245	      (const_int 4)
246	      (if_then_else (match_operand:QI 0 "short_memory_operand" "")
247			    (const_int 6)
248			    (const_int 8))
249	      (if_then_else (match_operand:QI 1 "short_memory_operand" "")
250			    (const_int 6)
251			    (const_int 8))
252	      (if_then_else (match_operand:QI 1 "short_memory_operand" "")
253			    (const_int 6)
254			    (const_int 8))
255	      (const_int 4)
256	      (const_int 8)
257	      (const_int 8)])])
258
259;; ::::::::::::::::::::
260;; ::
261;; :: Conversions
262;; ::
263;; ::::::::::::::::::::
264
265(define_insn "extendqihi2"
266  [(set (match_operand:HI 0 "register_operand" "=r")
267	(sign_extend:HI (match_operand:QI 1 "register_operand" "0")))]
268  ""
269  "cbw %0")
270
271(define_insn "zero_extendqihi2"
272  [(set (match_operand:HI                 0 "register_operand" 	   "=e,r")
273	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "m,0")))]
274  ""
275  "@
276   mov.b %0, %1
277   shl %0,#8\n\tshr %0,#8"
278  [(set_attr "psw_operand" "nop,0")
279   (set_attr_alternative "length"
280	     [(const_int 4)
281	      (const_int 8)])])
282
283;; ::::::::::::::::::::
284;; ::
285;; :: Bit field extraction
286;; ::
287;; ::::::::::::::::::::
288
289;; Extract an unsigned bit field
290;(define_insn "extzv"
291;  [(set (match_operand:SI 0 "register_operand" "=r")
292;	(zero_extract:SI (match_operand:SI 1 "register_operand" "r")
293;			 (match_operand:SI 2 "const_int_operand" "n")
294;			 (match_operand:SI 3 "const_int_operand" "n")))]
295;  ""
296;  "extzv %0,%1,%2,%3"
297;  [(set_attr "length" "4")])
298
299;; Insert a bit field
300;(define_insn "insv"
301;  [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
302;			 (match_operand:SI 1 "const_int_operand" "n")
303;			 (match_operand:SI 2 "const_int_operand" "n"))
304;	(match_operand:SI 3 "nonmemory_operand" "ri"))]
305;  ""
306;  "insv %0,%1,%2,%3"
307;  [(set_attr "length" "4")])
308
309
310;; ::::::::::::::::::::
311;; ::
312;; :: 16-bit Integer arithmetic
313;; ::
314;; ::::::::::::::::::::
315
316;; Addition
317; Note - the early clobber modifier is no longer needed on operand 3
318; and in fact can cause some reload spill failures if it is present.
319; Note that the 'Z' constraint matches "add $reg,0", which reload
320; will occasionally emit.  We avoid the "add $reg,imm" match because
321; it clobbers the carry.
322(define_insn "addhi3"
323  [(set (match_operand:HI 0 "register_operand" "=r,r,r,T,T,r,r,r")
324	(plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0,0,0")
325		 (match_operand:HI 2 "xs_hi_nonmemory_operand" "O,P,Z,L,M,Ir,N,i")))
326   (clobber (reg:BI CARRY_REG))]
327  ""
328  "@
329   inc %0,%o2
330   dec %0,%O2
331   ;
332   add Rx,%2
333   sub Rx,#%n2
334   add %0,%2
335   sub %0,#%n2
336   add %0,%2"
337  [(set_attr "length" "2,2,0,2,2,2,2,4")])
338
339(define_insn "addchi4"
340  [(set (match_operand:HI 0 "register_operand" "=T,r,r")
341	(plus:HI (match_operand:HI 1 "register_operand" "%0,0,0")
342		 (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
343   (set (reg:BI CARRY_REG)
344        (truncate:BI (lshiftrt:SI (plus:SI (zero_extend:SI (match_dup 1))
345					   (zero_extend:SI (match_dup 2)))
346				  (const_int 16))))]
347  ""
348  "@
349   add Rx,%2
350   add %0,%2
351   add %0,%2"
352  [(set_attr "length" "2,2,4")])
353
354(define_insn "addchi5"
355  [(set (match_operand:HI 0 "register_operand" "=T,r,r")
356	(plus:HI (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0")
357			  (zero_extend:HI (reg:BI CARRY_REG)))
358		 (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
359   (set (reg:BI CARRY_REG)
360        (truncate:BI (lshiftrt:SI (plus:SI (plus:SI
361					    (zero_extend:SI (match_dup 1))
362					    (zero_extend:SI (reg:BI CARRY_REG)))
363					   (zero_extend:SI (match_dup 2)))
364				  (const_int 16))))]
365  ""
366  "@
367   adc Rx,%2
368   adc %0,%2
369   adc %0,%2"
370  [(set_attr "length" "2,2,4")])
371
372;; Subtraction
373; Operand 3 is marked earlyclobber because that helps reload
374; to generate better code---this pattern will never need the
375; carry register as an input, and some output reloads or input
376; reloads might need to use it.  In fact, without the '&' reload
377; will fail in some cases.
378(define_insn "subhi3"
379  [(set (match_operand:HI 0 "register_operand" "=r,r,T,T,r,r,r")
380	(minus:HI (match_operand:HI 1 "register_operand" "0,0,0,0,0,0,0")
381		  (match_operand:HI 2 "xs_hi_nonmemory_operand" "O,P,L,M,rI,M,i")))
382   (clobber (reg:BI CARRY_REG))]
383  ""
384  "@
385   dec %0,%o2
386   inc %0,%O2
387   sub Rx,%2
388   add Rx,#%n2
389   sub %0,%2
390   add %0,#%n2
391   sub %0,%2"
392  [(set_attr "length" "2,2,2,2,2,2,4")])
393
394(define_insn "subchi4"
395  [(set (match_operand:HI 0 "register_operand" "=T,r,r")
396	(minus:HI (match_operand:HI 1 "register_operand" "0,0,0")
397		  (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
398   (set (reg:BI CARRY_REG)
399        (truncate:BI (lshiftrt:SI (minus:SI (zero_extend:SI (match_dup 1))
400					    (zero_extend:SI (match_dup 2)))
401				  (const_int 16))))]
402  ""
403  "@
404   sub Rx,%2
405   sub %0,%2
406   sub %0,%2"
407  [(set_attr "length" "2,2,4")])
408
409(define_insn "subchi5"
410  [(set (match_operand:HI 0 "register_operand" "=T,r,r")
411	(minus:HI (minus:HI (match_operand:HI 1 "register_operand" "0,0,0")
412			  (zero_extend:HI (reg:BI CARRY_REG)))
413		 (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
414   (set (reg:BI CARRY_REG)
415        (truncate:BI (lshiftrt:SI (minus:SI (minus:SI
416					     (zero_extend:SI (match_dup 1))
417					     (zero_extend:SI (reg:BI CARRY_REG)))
418					    (zero_extend:SI (match_dup 2)))
419				  (const_int 16))))]
420  ""
421  "@
422   sbc Rx,%2
423   sbc %0,%2
424   sbc %0,%2"
425  [(set_attr "length" "2,2,4")])
426
427; Basic multiplication
428(define_insn "mulhi3"
429  [(set (match_operand:HI 0 "register_operand" "=a")
430	(mult:HI (match_operand:HI 1 "register_operand" "%a")
431		 (match_operand:HI 2 "register_operand" "c")))
432   (clobber (match_scratch:HI 3 "=b"))
433   ]
434  ""
435  "mul"
436  [(set_attr "psw_operand" "nop")])
437
438;; Unsigned multiplication producing 64-bit results from 32-bit inputs
439; The constraint on operand 0 is 't' because it is actually two regs
440; long, and both regs must match the constraint.
441(define_insn "umulhisi3"
442  [(set (match_operand:SI 0 "register_operand" "=t")
443	(mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%a"))
444		 (zero_extend:SI (match_operand:HI 2 "register_operand" "c"))))
445   ]
446  ""
447  "mul"
448  [(set_attr "psw_operand" "nop")])
449
450;; Unsigned division giving both quotient and remainder
451(define_insn "udivmodhi4"
452  [(set (match_operand:HI 0 "register_operand" "=a")
453	(udiv:HI (match_operand:HI 1 "register_operand" "a")
454		 (match_operand:HI 2 "register_operand" "c")))
455   (set (match_operand:HI 3 "register_operand" "=b")
456	(umod:HI (match_dup 1)
457		 (match_dup 2)))]
458  ""
459  "div"
460  [(set_attr "psw_operand" "nop")])
461
462;; Signed division giving both quotient and remainder
463(define_insn "divmodhi4"
464  [(set (match_operand:HI 0 "register_operand" "=a")
465	(div:HI (match_operand:HI 1 "register_operand" "a")
466		 (match_operand:HI 2 "register_operand" "c")))
467   (set (match_operand:HI 3 "register_operand" "=b")
468	(mod:HI (match_dup 1)
469		 (match_dup 2)))]
470  ""
471  "sdiv"
472  [(set_attr "psw_operand" "nop")])
473
474;; Signed 32/16 division
475(define_insn "sdivlh"
476  [(set (match_operand:HI 0 "register_operand" "=a")
477	(div:HI (match_operand:SI 2 "register_operand" "t")
478		 (match_operand:HI 3 "register_operand" "c")))
479   (set (match_operand:HI 1 "register_operand" "=b")
480	(mod:HI (match_dup 2)
481		 (match_dup 3)))]
482  ""
483  "sdivlh"
484  [(set_attr "psw_operand" "nop")])
485
486;; Unsigned 32/16 division
487(define_insn "udivlh"
488  [(set (match_operand:HI 0 "register_operand" "=a")
489	(udiv:HI (match_operand:SI 2 "register_operand" "t")
490		 (match_operand:HI 3 "register_operand" "c")))
491   (set (match_operand:HI 1 "register_operand" "=b")
492	(umod:HI (match_dup 2)
493		 (match_dup 3)))]
494  ""
495  "divlh"
496  [(set_attr "psw_operand" "nop")])
497
498;; Negation
499
500(define_expand "neghi2"
501  [(set (match_operand:HI 0 "register_operand" "")
502	(not:HI (match_operand:HI 1 "register_operand" "")))
503   (parallel [(set (match_dup 0) (plus:HI (match_dup 0) (const_int 1)))
504	      (clobber (reg:BI CARRY_REG))])]
505  ""
506  "")
507
508;; ::::::::::::::::::::
509;; ::
510;; :: 16-bit Integer Shifts and Rotates
511;; ::
512;; ::::::::::::::::::::
513
514;; Arithmetic Shift Left
515(define_insn "ashlhi3"
516  [(set (match_operand:HI 0 "register_operand" "=r")
517	(ashift:HI (match_operand:HI 1 "register_operand" "0")
518		   (match_operand:HI 2 "nonmemory_operand" "ri")))
519   (clobber (reg:BI CARRY_REG))]
520  ""
521  "shl %0,%2")
522
523;; Arithmetic Shift Right
524(define_insn "ashrhi3"
525  [(set (match_operand:HI 0 "register_operand" "=r")
526	(ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
527		     (match_operand:HI 2 "nonmemory_operand" "ri")))
528   (clobber (reg:BI CARRY_REG))]
529  ""
530  "asr %0,%2")
531
532;; Logical Shift Right
533(define_insn "lshrhi3"
534  [(set (match_operand:HI 0 "register_operand" "=r")
535	(lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
536		     (match_operand:HI 2 "nonmemory_operand" "ri")))
537   (clobber (reg:BI CARRY_REG))]
538  ""
539  "shr %0,%2")
540
541;; ::::::::::::::::::::
542;; ::
543;; :: 16-Bit Integer Logical operations
544;; ::
545;; ::::::::::::::::::::
546
547;; Logical AND, 16-bit integers
548(define_insn "andhi3"
549  [(set (match_operand:HI 0 "xstormy16_splittable_below100_or_register" "=T,r,r,r,W")
550	(and:HI (match_operand:HI 1 "xstormy16_below100_or_register" "%0,0,0,0,0")
551		(match_operand:HI 2 "nonmemory_operand" "L,r,K,i,K")))]
552  ""
553  "@
554   and Rx,%2
555   and %0,%2
556   clr1 %0,%B2
557   and %0,%2
558   #"
559  [(set_attr "length" "2,2,2,4,2")])
560
561(define_split
562  [(set (match_operand:HI 0 "xstormy16_below100_operand" "")
563	(and:HI (match_operand:HI 1 "xstormy16_below100_operand" "")
564		(match_operand:HI 2 "xstormy16_onebit_clr_operand" "")))]
565  ""
566  [(set (match_dup 3)
567	(and:QI (match_dup 4)
568		(match_dup 5)))]
569  { int s = ((INTVAL (operands[2]) & 0xff) == 0xff) ? 1 : 0;
570    operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, s);
571    operands[4] = simplify_gen_subreg (QImode, operands[1], HImode, s);
572    operands[5] = simplify_gen_subreg (QImode, operands[2], HImode, s);
573    operands[5] = GEN_INT (INTVAL (operands[5]) | ~ (HOST_WIDE_INT) 0xff);
574  })
575
576;; Inclusive OR, 16-bit integers
577(define_insn "iorhi3"
578  [(set (match_operand:HI 0 "xstormy16_splittable_below100_or_register" "=T,r,r,r,W")
579	(ior:HI (match_operand:HI 1 "xstormy16_below100_or_register" "%0,0,0,0,0")
580		(match_operand:HI 2 "nonmemory_operand" "L,r,J,i,J")))]
581  ""
582  "@
583   or Rx,%2
584   or %0,%2
585   set1 %0,%B2
586   or %0,%2
587   #"
588  [(set_attr "length" "2,2,2,4,2")])
589
590(define_split
591  [(set (match_operand:HI 0 "xstormy16_below100_operand" "")
592	(ior:HI (match_operand:HI 1 "xstormy16_below100_operand" "")
593		(match_operand:HI 2 "xstormy16_onebit_set_operand" "")))]
594  ""
595  [(set (match_dup 3)
596	(ior:QI (match_dup 4)
597		(match_dup 5)))]
598  { int s = ((INTVAL (operands[2]) & 0xff) == 0x00) ? 1 : 0;
599    operands[3] = simplify_gen_subreg (QImode, operands[0], HImode, s);
600    operands[4] = simplify_gen_subreg (QImode, operands[1], HImode, s);
601    operands[5] = simplify_gen_subreg (QImode, operands[2], HImode, s);
602    operands[5] = GEN_INT (INTVAL (operands[5]) & 0xff);
603  })
604
605;; Exclusive OR, 16-bit integers
606(define_insn "xorhi3"
607  [(set (match_operand:HI 0 "register_operand" "=T,r,r")
608	(xor:HI (match_operand:HI 1 "register_operand" "%0,0,0")
609		(match_operand:HI 2 "nonmemory_operand" "L,r,i")))]
610  ""
611  "@
612   xor Rx,%2
613   xor %0,%2
614   xor %0,%2"
615  [(set_attr "length" "2,2,4")])
616
617;; One's complement, 16-bit integers
618(define_insn "one_cmplhi2"
619  [(set (match_operand:HI 0 "register_operand" "=r")
620	(not:HI (match_operand:HI 1 "register_operand" "0")))]
621  ""
622  "not %0")
623
624;; ::::::::::::::::::::
625;; ::
626;; :: 32-bit Integer arithmetic
627;; ::
628;; ::::::::::::::::::::
629
630;; Addition
631(define_insn_and_split "addsi3"
632  [(set (match_operand:SI 0 "register_operand" "=r")
633	(plus:SI (match_operand:SI 1 "register_operand" "%0")
634		 (match_operand:SI 2 "nonmemory_operand" "ri")))
635   (clobber (reg:BI CARRY_REG))]
636  ""
637  "#"
638  "reload_completed"
639  [(pc)]
640  { xstormy16_expand_arith (SImode, PLUS, operands[0], operands[1],
641			    operands[2]);
642    DONE;
643  }
644  [(set_attr "length" "4")])
645
646;; Subtraction
647(define_insn_and_split "subsi3"
648  [(set (match_operand:SI 0 "register_operand" "=r")
649	(minus:SI (match_operand:SI 1 "register_operand" "0")
650		 (match_operand:SI 2 "nonmemory_operand" "ri")))
651   (clobber (reg:BI CARRY_REG))]
652  ""
653  "#"
654  "reload_completed"
655  [(pc)]
656  { xstormy16_expand_arith (SImode, MINUS, operands[0], operands[1],
657			    operands[2]);
658    DONE;
659  }
660  [(set_attr "length" "4")])
661
662(define_expand "negsi2"
663  [(parallel [(set (match_operand:SI 0 "register_operand" "")
664		   (neg:SI (match_operand:SI 1 "register_operand" "")))
665	      (clobber (reg:BI CARRY_REG))])]
666  ""
667  { operands[2] = gen_reg_rtx (HImode); })
668
669(define_insn_and_split "*negsi2_internal"
670  [(set (match_operand:SI 0 "register_operand" "=&r")
671	(neg:SI (match_operand:SI 1 "register_operand" "r")))
672   (clobber (reg:BI CARRY_REG))]
673  ""
674  "#"
675  "reload_completed"
676  [(pc)]
677  { xstormy16_expand_arith (SImode, NEG, operands[0], operands[0],
678			    operands[1]);
679    DONE;
680  })
681
682;; ::::::::::::::::::::
683;; ::
684;; :: 32-bit Integer Shifts and Rotates
685;; ::
686;; ::::::::::::::::::::
687
688;; Arithmetic Shift Left
689(define_expand "ashlsi3"
690  [(parallel [(set (match_operand:SI 0 "register_operand" "")
691		   (ashift:SI (match_operand:SI 1 "register_operand" "")
692			      (match_operand:SI 2 "const_int_operand" "")))
693	      (clobber (reg:BI CARRY_REG))
694	      (clobber (match_dup 3))])]
695  ""
696  { if (! const_int_operand (operands[2], SImode))
697      FAIL;
698    operands[3] = gen_reg_rtx (HImode);
699  })
700
701;; Arithmetic Shift Right
702(define_expand "ashrsi3"
703  [(parallel [(set (match_operand:SI 0 "register_operand" "")
704		   (ashiftrt:SI (match_operand:SI 1 "register_operand" "")
705			        (match_operand:SI 2 "const_int_operand" "")))
706	      (clobber (reg:BI CARRY_REG))
707	      (clobber (match_dup 3))])]
708  ""
709  { if (! const_int_operand (operands[2], SImode))
710      FAIL;
711    operands[3] = gen_reg_rtx (HImode);
712  })
713
714;; Logical Shift Right
715(define_expand "lshrsi3"
716  [(parallel [(set (match_operand:SI 0 "register_operand" "")
717		   (lshiftrt:SI (match_operand:SI 1 "register_operand" "")
718			        (match_operand:SI 2 "const_int_operand" "")))
719	      (clobber (reg:BI CARRY_REG))
720	      (clobber (match_dup 3))])]
721  ""
722  { if (! const_int_operand (operands[2], SImode))
723      FAIL;
724    operands[3] = gen_reg_rtx (HImode);
725  })
726
727(define_insn "*shiftsi"
728  [(set (match_operand:SI 0 "register_operand" "=r,r")
729	(match_operator:SI 4 "shift_operator"
730	 [(match_operand:SI 1 "register_operand" "0,0")
731	  (match_operand:SI 2 "const_int_operand" "U,n")]))
732   (clobber (reg:BI CARRY_REG))
733   (clobber (match_operand:HI 3 "" "=X,r"))]
734  ""
735  "* return xstormy16_output_shift (SImode, GET_CODE (operands[4]),
736				    operands[0], operands[2], operands[3]);"
737  [(set_attr "length" "6,10")
738   (set_attr "psw_operand" "clobber,clobber")])
739
740
741;; ::::::::::::::::::::
742;; ::
743;; :: Branches
744;; ::
745;; ::::::::::::::::::::
746
747(define_expand "cbranchhi4"
748  [(set (pc)
749	(if_then_else (match_operator 0 "comparison_operator"
750				      [(match_operand:HI 1 "register_operand" "")
751				       (match_operand:HI 2 "nonmemory_operand" "")])
752		      (label_ref (match_operand 3 "" ""))
753		      (pc)))
754   (clobber (reg:BI CARRY_REG))]
755  ""
756  {
757  xstormy16_emit_cbranch (GET_CODE (operands[0]), operands[1], operands[2],
758			  operands[3]);
759  DONE;
760})
761
762(define_expand "cbranchsi4"
763  [(set (pc)
764	(if_then_else (match_operator 0 "comparison_operator"
765				      [(match_operand:SI 1 "register_operand" "")
766				       (match_operand:SI 2 "nonmemory_operand" "")])
767		      (label_ref (match_operand 3 "" ""))
768		      (pc)))
769   (clobber (reg:BI CARRY_REG))]
770  ""
771  {
772  xstormy16_emit_cbranch (GET_CODE (operands[0]), operands[1], operands[2],
773			  operands[3]);
774  DONE;
775})
776
777(define_insn "cbranchhi"
778  [(set (pc)
779	(if_then_else (match_operator:HI 1 "comparison_operator"
780				      [(match_operand:HI 2 "nonmemory_operand"
781					"r,e,L")
782				       (match_operand:HI 3 "nonmemory_operand"
783						      "r,L,e")])
784		      (label_ref (match_operand 0 "" ""))
785		      (pc)))
786   (clobber (reg:BI CARRY_REG))]
787  ""
788  "*
789{
790  return xstormy16_output_cbranch_hi (operands[1], \"%l0\", 0, insn);
791}"
792  [(set_attr "branch_class" "bcc12")
793   (set_attr "psw_operand" "0,0,1")])
794
795(define_insn "cbranchhi_neg"
796  [(set (pc)
797	(if_then_else (match_operator:HI 1 "comparison_operator"
798				      [(match_operand:HI 2 "nonmemory_operand"
799							 "r,e,L")
800				       (match_operand:HI 3 "nonmemory_operand"
801							 "r,L,e")])
802		      (pc)
803		      (label_ref (match_operand 0 "" ""))))
804   (clobber (reg:BI CARRY_REG))]
805  ""
806  "*
807{
808  return xstormy16_output_cbranch_hi (operands[1], \"%l0\", 1, insn);
809}"
810  [(set_attr "branch_class" "bcc12")
811   (set_attr "psw_operand" "0,0,1")])
812
813(define_insn "*eqbranchsi"
814  [(set (pc)
815	(if_then_else (match_operator:SI 1 "equality_operator"
816				      [(match_operand:SI 2 "register_operand"
817							 "r")
818				       (const_int 0)])
819		      (label_ref (match_operand 0 "" ""))
820		      (pc)))
821   (clobber (match_operand:SI 3 "register_operand" "=2"))]
822  ""
823  "*
824{
825  return xstormy16_output_cbranch_si (operands[1], \"%l0\", 0, insn);
826}"
827  [(set_attr "branch_class" "bcc8p2")
828   (set_attr "psw_operand" "clobber")])
829
830(define_insn_and_split "*ineqbranchsi"
831  [(set (pc)
832	(if_then_else (match_operator:SI 1 "xstormy16_ineqsi_operator"
833				      [(match_operand:SI 2 "register_operand"
834							 "r")
835				       (match_operand:SI 3 "nonmemory_operand"
836							 "ri")])
837		      (label_ref (match_operand 0 "" ""))
838		      (pc)))
839   (clobber (match_operand:SI 4 "register_operand" "=2"))
840   (clobber (reg:BI CARRY_REG))]
841  ""
842  "#"
843  "reload_completed"
844  [(pc)]
845  { xstormy16_split_cbranch (SImode, operands[0], operands[1], operands[2]); DONE; }
846  [(set_attr "length" "8")])
847
848(define_insn "*ineqbranch_1"
849  [(set (pc)
850	(if_then_else (match_operator:HI 4 "xstormy16_ineqsi_operator"
851		       [(minus:HI (match_operand:HI 1 "register_operand" "T,r,r")
852			   (zero_extend:HI (reg:BI CARRY_REG)))
853			(match_operand:HI 3 "nonmemory_operand" "L,r,i")])
854		      (label_ref (match_operand 0 "" ""))
855		      (pc)))
856   (set (match_operand:HI 2 "register_operand" "=1,1,1")
857	(minus:HI (minus:HI (match_dup 1) (zero_extend:HI (reg:BI CARRY_REG)))
858		  (match_dup 3)))
859   (clobber (reg:BI CARRY_REG))]
860  ""
861  "*
862{
863  return xstormy16_output_cbranch_si (operands[4], \"%l0\", 0, insn);
864}"
865  [(set_attr "branch_class" "bcc8p2,bcc8p2,bcc8p4")
866   (set_attr "psw_operand" "2,2,2")])
867
868;; ::::::::::::::::::::
869;; ::
870;; :: Call and branch instructions
871;; ::
872;; ::::::::::::::::::::
873
874;; Subroutine call instruction returning no value.  Operand 0 is the function
875;; to call; operand 1 is the number of bytes of arguments pushed (in mode
876;; `SImode', except it is normally a `const_int'); operand 2 is the number of
877;; registers used as operands.
878
879;; On most machines, operand 2 is not actually stored into the RTL pattern.  It
880;; is supplied for the sake of some RISC machines which need to put this
881;; information into the assembler code; they can put it in the RTL instead of
882;; operand 1.
883
884(define_expand "call"
885  [(call (match_operand:HI 0 "memory_operand" "m")
886	 (match_operand 1 "" ""))
887   (use (match_operand 2 "immediate_operand" ""))]
888  ""
889  "xstormy16_expand_call (NULL_RTX, operands[0], operands[1]); DONE;")
890
891;; Subroutine call instruction returning a value.  Operand 0 is the hard
892;; register in which the value is returned.  There are three more operands, the
893;; same as the three operands of the `call' instruction (but with numbers
894;; increased by one).
895
896;; Subroutines that return `BLKmode' objects use the `call' insn.
897
898(define_expand "call_value"
899  [(set (match_operand 0 "register_operand" "=r")
900	(call (match_operand:HI 1 "memory_operand" "m")
901	      (match_operand:SI 2 "" "")))
902	(use (match_operand 3 "immediate_operand" ""))]
903  ""
904  "xstormy16_expand_call (operands[0], operands[1], operands[2]); DONE;")
905
906(define_insn "*call_internal"
907  [(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "i,r"))
908	 (match_operand 1 "" ""))
909   (use (match_operand:HI 2 "nonmemory_operand" "X,z"))]
910  ""
911  "@
912   callf %C0
913   call %2,%0"
914  [(set_attr "length" "4,2")
915   (set_attr "psw_operand" "clobber")])
916
917(define_insn "*call_value_internal"
918  [(set (match_operand 3 "register_operand" "=r,r")
919        (call (mem:HI (match_operand:HI 0 "nonmemory_operand" "i,r"))
920	      (match_operand 1 "" "")))
921   (use (match_operand:HI 2 "nonmemory_operand" "X,z"))]
922  ""
923  "@
924   callf %C0
925   call %2,%0"
926  [(set_attr "length" "4,2")
927   (set_attr "psw_operand" "clobber")])
928
929;; Subroutine return
930(define_expand "return"
931  [(return)]
932  "direct_return()"
933  "")
934
935(define_insn "return_internal"
936  [(return)]
937  ""
938  "ret"
939  [(set_attr "psw_operand" "nop")])
940
941(define_insn "return_internal_interrupt"
942  [(return)
943   (unspec_volatile [(const_int 0)] 1)]
944  ""
945  "iret"
946  [(set_attr "psw_operand" "clobber")])
947
948;; Normal unconditional jump
949(define_insn "jump"
950  [(set (pc) (label_ref (match_operand 0 "" "")))]
951  ""
952  "*
953{
954  return xstormy16_output_cbranch_hi (NULL_RTX, \"%l0\", 0, insn);
955}"
956  [(set_attr "branch_class" "br12")
957   (set_attr "psw_operand" "nop")])
958
959;; Indirect jump through a register
960(define_expand "indirect_jump"
961  [(set (match_dup 1) (const_int 0))
962   (parallel [(set (pc) (match_operand:HI 0 "register_operand" ""))
963	      (use (match_dup 1))])]
964  ""
965  "operands[1] = gen_reg_rtx (HImode);")
966
967(define_insn ""
968  [(set (pc) (match_operand:HI 0 "register_operand" "r"))
969   (use (match_operand:HI 1 "register_operand" "z"))]
970  ""
971  "jmp %1,%0"
972  [(set_attr "length" "4")
973   (set_attr "psw_operand" "nop")])
974
975;; Table-based switch statements.
976(define_expand "casesi"
977  [(use (match_operand:SI 0 "register_operand" ""))
978   (use (match_operand:SI 1 "immediate_operand" ""))
979   (use (match_operand:SI 2 "immediate_operand" ""))
980   (use (label_ref (match_operand 3 "" "")))
981   (use (label_ref (match_operand 4 "" "")))]
982  ""
983  "
984{
985  xstormy16_expand_casesi (operands[0], operands[1], operands[2],
986			  operands[3], operands[4]);
987  DONE;
988}")
989
990(define_insn "tablejump_pcrel"
991  [(set (pc) (mem:HI (plus:HI (pc)
992			      (match_operand:HI 0 "register_operand" "r"))))
993   (use (label_ref:SI (match_operand 1 "" "")))]
994  ""
995  "br %0"
996  [(set_attr "psw_operand" "nop")])
997
998;; ::::::::::::::::::::
999;; ::
1000;; :: Prologue and Epilogue instructions
1001;; ::
1002;; ::::::::::::::::::::
1003
1004;; Called after register allocation to add any instructions needed for
1005;; the prologue.  Using a prologue insn is favored compared to putting
1006;; all of the instructions in the TARGET_ASM_FUNCTION_PROLOGUE macro,
1007;; since it allows the scheduler to intermix instructions with the
1008;; saves of the caller saved registers.  In some cases, it might be
1009;; necessary to emit a barrier instruction as the last insn to prevent
1010;; such scheduling.
1011(define_expand "prologue"
1012  [(const_int 1)]
1013  ""
1014  {
1015    xstormy16_expand_prologue ();
1016    DONE;
1017  })
1018
1019;; Called after register allocation to add any instructions needed for
1020;; the epilogue.  Using an epilogue insn is favored compared to putting
1021;; all of the instructions in the TARGET_ASM_FUNCTION_EPILOGUE macro,
1022;; since it allows the scheduler to intermix instructions with the
1023;; restores of the caller saved registers.  In some cases, it might be
1024;; necessary to emit a barrier instruction as the first insn to
1025;; prevent such scheduling.
1026(define_expand "epilogue"
1027  [(const_int 2)]
1028  ""
1029  {
1030    xstormy16_expand_epilogue ();
1031    DONE;
1032  })
1033
1034;; ::::::::::::::::::::
1035;; ::
1036;; :: Miscellaneous instructions
1037;; ::
1038;; ::::::::::::::::::::
1039
1040;; No operation, needed in case the user uses -g but not -O.
1041(define_insn "nop"
1042  [(const_int 0)]
1043  ""
1044  "nop"
1045  [(set_attr "psw_operand" "nop")])
1046
1047;; Pseudo instruction that prevents the scheduler from moving code above this
1048;; point.
1049(define_insn "blockage"
1050  [(unspec_volatile [(const_int 0)] 0)]
1051  ""
1052  ""
1053  [(set_attr "length" "0")
1054   (set_attr "psw_operand" "nop")])
1055
1056;;---------------------------------------------------------------------------
1057
1058(define_expand "iorqi3"
1059  [(match_operand:QI 0 "xstormy16_below100_or_register" "")
1060   (match_operand:QI 1 "xstormy16_below100_or_register" "")
1061   (match_operand:QI 2 "nonmemory_operand" "")]
1062  ""
1063  {
1064    xstormy16_expand_iorqi3 (operands);
1065    DONE;
1066  })
1067
1068(define_insn "iorqi3_internal"
1069  [(set (match_operand:QI 0 "xstormy16_below100_or_register" "=Wr")
1070	(ior:QI (match_operand:QI 1 "xstormy16_below100_or_register" "0")
1071		(match_operand:QI 2 "xstormy16_onebit_set_operand" "i")))]
1072  ""
1073  "set1 %0,%B2"
1074  [(set_attr "length" "2")
1075   (set_attr "psw_operand" "0")])
1076
1077(define_peephole2
1078  [(set (match_operand:QI 0 "register_operand" "")
1079	(match_operand:QI 1 "xstormy16_below100_operand" ""))
1080   (set (match_operand:HI 2 "register_operand" "")
1081	(ior:HI (match_operand:HI 3 "register_operand" "")
1082		(match_operand:QI 4 "xstormy16_onebit_set_operand" "")))
1083   (set (match_operand:QI 5 "xstormy16_below100_operand" "")
1084	(match_operand:QI 6 "register_operand" ""))
1085   ]
1086  "REGNO (operands[0]) == REGNO (operands[2])
1087   && REGNO (operands[0]) == REGNO (operands[3])
1088   && REGNO (operands[0]) == REGNO (operands[6])
1089   && rtx_equal_p (operands[1], operands[5])"
1090  [(set (match_dup 1)
1091	(ior:QI (match_dup 1)
1092		(match_dup 4)))
1093   ]
1094  "")
1095
1096
1097(define_expand "andqi3"
1098  [(match_operand:QI 0 "xstormy16_below100_or_register" "")
1099   (match_operand:QI 1 "xstormy16_below100_or_register" "")
1100   (match_operand:QI 2 "nonmemory_operand" "")]
1101  ""
1102  {
1103    xstormy16_expand_andqi3 (operands);
1104    DONE;
1105  })
1106
1107(define_insn "andqi3_internal"
1108  [(set (match_operand:QI 0 "xstormy16_below100_or_register" "=Wr")
1109	(and:QI (match_operand:QI 1 "xstormy16_below100_or_register" "0")
1110		(match_operand:QI 2 "xstormy16_onebit_clr_operand" "i")))]
1111  ""
1112  "clr1 %0,%B2"
1113  [(set_attr "length" "2")
1114   (set_attr "psw_operand" "0")])
1115
1116(define_peephole2
1117  [(set (match_operand:HI 0 "register_operand" "")
1118	(and:HI (match_operand:HI 1 "register_operand" "")
1119		(match_operand 2 "immediate_operand" "")))
1120   (set (match_operand:HI 3 "register_operand" "")
1121	(zero_extend:HI (match_operand:QI 4 "register_operand" "")));
1122   ]
1123  "REGNO (operands[0]) == REGNO (operands[1])
1124   && REGNO (operands[0]) == REGNO (operands[3])
1125   && REGNO (operands[0]) == REGNO (operands[4])"
1126  [(set (match_dup 0)
1127	(and:HI (match_dup 1)
1128		(match_dup 5)))
1129   ]
1130  "operands[5] = GEN_INT (INTVAL (operands[2]) & 0xff);")
1131
1132(define_peephole2
1133  [(set (match_operand:QI 0 "register_operand" "")
1134	(match_operand:QI 1 "xstormy16_below100_operand" ""))
1135   (set (match_operand:HI 2 "register_operand" "")
1136	(and:HI (match_operand:HI 3 "register_operand" "")
1137		(match_operand:QI 4 "xstormy16_onebit_clr_operand" "")))
1138   (set (match_operand:QI 5 "xstormy16_below100_operand" "")
1139	(match_operand:QI 6 "register_operand" ""))
1140   ]
1141  "REGNO (operands[0]) == REGNO (operands[2])
1142   && REGNO (operands[0]) == REGNO (operands[3])
1143   && REGNO (operands[0]) == REGNO (operands[6])
1144   && rtx_equal_p (operands[1], operands[5])"
1145  [(set (match_dup 1)
1146	(and:QI (match_dup 1)
1147		(match_dup 4)))
1148   ]
1149  "")
1150
1151;; GCC uses different techniques to optimize MSB and LSB accesses, so
1152;; we have to code those separately.
1153
1154(define_insn "*bclrx"
1155  [(set (pc)
1156	(if_then_else (eq:HI (and:QI (match_operand:QI 1 "xstormy16_below100_operand" "W")
1157				     (match_operand:HI 2 "immediate_operand" "i"))
1158			     (const_int 0))
1159		      (label_ref (match_operand 0 "" ""))
1160		      (pc)))
1161   (clobber (reg:BI CARRY_REG))]
1162  ""
1163  "bn %1,%B2,%l0"
1164  [(set_attr "length" "4")
1165   (set_attr "psw_operand" "nop")])
1166
1167(define_insn "*bclrx2"
1168  [(set (pc)
1169	(if_then_else (zero_extract:HI
1170		       (xor:HI (subreg:HI
1171				(match_operand:QI 1 "xstormy16_below100_operand" "W") 0)
1172			       (match_operand:HI 2 "xstormy16_onebit_set_operand" "J"))
1173		       (const_int 1)
1174		       (match_operand:HI 3 "immediate_operand" "i"))
1175		      (label_ref (match_operand 0 "" ""))
1176		      (pc)))
1177   (clobber (reg:BI CARRY_REG))]
1178  ""
1179  "bn %1,%B2,%l0"
1180  [(set_attr "length" "4")
1181   (set_attr "psw_operand" "nop")])
1182
1183(define_insn "*bclrx3"
1184  [(set (pc)
1185	(if_then_else (eq:HI (and:HI (zero_extend:HI (match_operand:QI 1 "xstormy16_below100_operand" "W"))
1186				     (match_operand:HI 2 "immediate_operand" "i"))
1187			     (const_int 0))
1188		      (label_ref (match_operand 0 "" ""))
1189		      (pc)))
1190   (clobber (reg:BI CARRY_REG))]
1191  ""
1192  "bn %1,%B2,%l0"
1193  [(set_attr "length" "4")
1194   (set_attr "psw_operand" "nop")])
1195
1196(define_insn "*bclr7"
1197  [(set (pc)
1198	(if_then_else (xor:HI (lshiftrt:HI (subreg:HI
1199					    (match_operand:QI 1 "xstormy16_below100_operand" "W") 0)
1200					   (const_int 7))
1201			      (const_int 1))
1202		      (label_ref (match_operand 0 "" ""))
1203		      (pc)))
1204   (clobber (reg:BI CARRY_REG))]
1205  ""
1206  "bn %1,#7,%l0"
1207  [(set_attr "length" "4")
1208   (set_attr "psw_operand" "nop")])
1209
1210(define_insn "*bclr15"
1211  [(set (pc)
1212	(if_then_else (ge:HI (sign_extend:HI (match_operand:QI 1 "xstormy16_below100_operand" "W"))
1213			     (const_int 0))
1214		      (label_ref (match_operand 0 "" ""))
1215		      (pc)))
1216   (clobber (reg:BI CARRY_REG))]
1217  ""
1218  "bn %1,#7,%l0"
1219  [(set_attr "length" "4")
1220   (set_attr "psw_operand" "nop")])
1221
1222(define_insn "*bsetx"
1223  [(set (pc)
1224	(if_then_else (ne:HI (and:QI (match_operand:QI 1 "xstormy16_below100_operand" "W")
1225				     (match_operand:HI 2 "immediate_operand" "i"))
1226			     (const_int 0))
1227		      (label_ref (match_operand 0 "" ""))
1228		      (pc)))
1229   (clobber (reg:BI CARRY_REG))]
1230  ""
1231  "bp %1,%B2,%l0"
1232  [(set_attr "length" "4")
1233   (set_attr "psw_operand" "nop")])
1234
1235(define_insn "*bsetx2"
1236  [(set (pc)
1237	(if_then_else (zero_extract:HI (match_operand:QI 1 "xstormy16_below100_operand" "W")
1238				       (const_int 1)
1239				       (match_operand:HI 2 "immediate_operand" "i"))
1240		      (label_ref (match_operand 0 "" ""))
1241		      (pc)))
1242   (clobber (reg:BI CARRY_REG))]
1243  ""
1244  "bp %1,%b2,%l0"
1245  [(set_attr "length" "4")
1246   (set_attr "psw_operand" "nop")])
1247
1248(define_insn "*bsetx3"
1249  [(set (pc)
1250	(if_then_else (ne:HI (and:HI (zero_extend:HI (match_operand:QI 1 "xstormy16_below100_operand" "W"))
1251				     (match_operand:HI 2 "immediate_operand" "i"))
1252			     (const_int 0))
1253		      (label_ref (match_operand 0 "" ""))
1254		      (pc)))
1255   (clobber (reg:BI CARRY_REG))]
1256  ""
1257  "bp %1,%B2,%l0"
1258  [(set_attr "length" "4")
1259   (set_attr "psw_operand" "nop")])
1260
1261(define_insn "*bset7"
1262  [(set (pc)
1263	(if_then_else (lshiftrt:HI (subreg:HI (match_operand:QI 1 "xstormy16_below100_operand" "W") 0)
1264				   (const_int 7))
1265		      (label_ref (match_operand 0 "" ""))
1266		      (pc)))
1267   (clobber (reg:BI CARRY_REG))]
1268  ""
1269  "bp %1,#7,%l0"
1270  [(set_attr "length" "4")
1271   (set_attr "psw_operand" "nop")])
1272
1273(define_insn "*bset15"
1274  [(set (pc)
1275	(if_then_else (lt:HI (sign_extend:HI (match_operand:QI 1 "xstormy16_below100_operand" "W"))
1276			     (const_int 0))
1277		      (label_ref (match_operand 0 "" ""))
1278		      (pc)))
1279   (clobber (reg:BI CARRY_REG))]
1280  ""
1281  "bp %1,#7,%l0"
1282  [(set_attr "length" "4")
1283   (set_attr "psw_operand" "nop")])
1284