OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [config/] [stormy16/] [stormy16.md] - Blame information for rev 297

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 282 jeremybenn
;; 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
;; .
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")])

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.