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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [config/] [cr16/] [predicates.md] - Blame information for rev 801

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

Line No. Rev Author Line
1 709 jeremybenn
;; Predicates of machine description for CR16.
2
;; Copyright (C) 2012 Free Software Foundation, Inc.
3
;; Contributed by KPIT Cummins Infosystems Limited.
4
;;
5
;; This file is part of GCC.
6
;;
7
;; GCC is free software; you can redistribute it and/or modify it
8
;; under the terms of the GNU General Public License as published
9
;; by the Free Software Foundation; either version 3, or (at your
10
;; option) any later version.
11
;;
12
;; GCC is distributed in the hope that it will be useful, but WITHOUT
13
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
;; License for more details.
16
;;
17
;; You should have received a copy of the GNU General Public License
18
;; along with GCC; see the file COPYING3.  If not see
19
;; .
20
 
21
;;  Predicates
22
 
23
;; Predicates for sbit/cbit instructions
24
;; bit operand used for the generation of bit insn generation
25
(define_predicate "bit_operand"
26
  (match_code "mem")
27
{
28
  return ((GET_CODE (op) == MEM && OK_FOR_Z (op)));
29
})
30
 
31
;; Unsigned 4-bits constant int or double value.
32
(define_predicate "u4bits_operand"
33
  (match_code "const_int,const_double")
34
{
35
  if (GET_CODE (op) == CONST_DOUBLE)
36
    return cr16_const_double_ok (op);
37
    return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 4)) ? 1 : 0;
38
})
39
 
40
;; Operand is a constant integer where
41
;; only one bit is set to 1.
42
(define_predicate "one_bit_operand"
43
  (match_code "const_int")
44
{
45
  unsigned int val;
46
 
47
  val = INTVAL (op);
48
  if (mode == QImode)
49
    val &= 0xff;
50
  else if (mode == HImode)
51
    val &= 0xffff;
52
  else
53
    gcc_unreachable();
54
 
55
  if (val != 0)
56
    return (val & (val - 1)) == 0; /* true if only one bit is set.  */
57
  else
58
    return 0;
59
})
60
 
61
;; Operand is a constant integer where
62
;; only one bit is set to 0.
63
(define_predicate "rev_one_bit_operand"
64
  (match_code "const_int")
65
{
66
  unsigned int val;
67
 
68
  val = ~INTVAL (op); /* Invert and use.  */
69
  if (mode == QImode)
70
    val &= 0xff;
71
  else if (mode == HImode)
72
    val &= 0xffff;
73
  else
74
    gcc_unreachable();
75
 
76
  if (val != 0)
77
    return (val & (val - 1)) == 0; /* true if only one bit is set.  */
78
  else
79
    return 0;
80
})
81
 
82
;; Predicates for shift instructions
83
;; Immediate operand predicate for count in shift operations.
84
;; Immediate shall be 3-bits in case operand to be operated on
85
;; is a qi mode operand.
86
(define_predicate "shift_qi_imm_operand"
87
  (match_code "const_int")
88
{
89
  return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 3)) ? 1 : 0;
90
})
91
 
92
;; Immediate shall be 4-bits in case operand to be operated on
93
;; is a hi mode operand.
94
(define_predicate "shift_hi_imm_operand"
95
  (match_code "const_int")
96
{
97
  return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 4)) ? 1 : 0;
98
})
99
 
100
;; Immediate shall be 3-bits in case operand to be operated on
101
;; is a si mode operand.
102
(define_predicate "shift_si_imm_operand"
103
  (match_code "const_int")
104
{
105
  return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 5)) ? 1 : 0;
106
})
107
 
108
;; Predicates for jump/call instructions
109
;; Jump immediate cannot be more than 24-bits
110
(define_predicate "jump_imm_operand"
111
  (match_code "const_int")
112
{
113
  return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 24)) ? 1 : 0;
114
})
115
 
116
;; Call immediate cannot be more than 24-bits
117
(define_predicate "call_imm_operand"
118
  (match_operand 0 "immediate_operand")
119
{
120
  if (GET_CODE (op) != CONST_INT) return 1;
121
    return (UNSIGNED_INT_FITS_N_BITS(INTVAL (op), 24)) ? 1 : 0;
122
})
123
 
124
;; Operand is register or 4-bit immediate operand
125
(define_predicate "reg_or_u4bits_operand"
126
  (ior (match_operand 0 "u4bits_operand")
127
       (match_operand 0 "register_operand")))
128
 
129
;; Operand is a register or symbol reference
130
(define_predicate "reg_or_sym_operand"
131
  (ior (match_code "symbol_ref")
132
       (match_operand 0 "register_operand")))
133
 
134
;; Operand is a non stack pointer register
135
(define_predicate "nosp_reg_operand"
136
  (and (match_operand 0 "register_operand")
137
       (match_test "REGNO (op) != SP_REGNUM")))
138
 
139
(define_predicate "hard_reg_operand"
140
  (and (match_operand 0 "register_operand")
141
       (match_test "REGNO (op) <= 15")))
142
 
143
;; Operand is a memory reference and
144
;; not a push operand.
145
(define_predicate "store_operand"
146
  (and (match_operand 0 "memory_operand")
147
       (not (match_operand 0 "push_operand"))))
148
 
149
;; Helper predicate
150
(define_predicate "reg_or_int_operand"
151
  (ior (match_code "const_int")
152
       (match_operand 0 "register_operand")))
153
 
154
;;
155
;;
156
;; Atithmetic/logical predicates
157
 
158
;; QI Helper
159
(define_predicate "arith_qi_operand"
160
   (match_code "const_int")
161
{
162
        return (IN_RAN(INTVAL (op), 0, 15) && ((INTVAL (op) != 9)
163
                || (INTVAL (op) != 11))) ? 1 : 0 ;
164
})
165
 
166
;;QI Reg, subreg(reg) or const_int.
167
(define_predicate "reg_qi_int_operand"
168
  (ior (match_operand 0 "arith_qi_operand")
169
       (match_operand 0 "register_operand")))
170
 
171
;; HI Helper
172
(define_predicate "arith_hi_operand"
173
   (match_code "const_int")
174
{
175
        return (IN_RAN(INTVAL (op), -32768, 32768) ) ? 1 : 0 ;
176
})
177
 
178
;;HI Reg, subreg(reg) or const_int.
179
(define_predicate "reg_hi_int_operand"
180
  (ior (match_operand 0 "arith_hi_operand")
181
       (match_operand 0 "register_operand")))
182
 
183
;;SI Reg, subreg(reg) or const_int.
184
(define_predicate "reg_si_int_operand"
185
  (ior (match_operand 0 "const_int_operand")
186
       (match_operand 0 "register_operand")))
187
 
188
;;
189
;; Shift predicates
190
 
191
;; QI Helper
192
(define_predicate "shift_qi_operand"
193
   (match_code "const_int")
194
{
195
        return (IN_RAN(INTVAL (op), 0, 7) ) ? 1 : 0;
196
})
197
 
198
;;QI Reg, subreg(reg) or const_int.
199
(define_predicate "shift_reg_qi_int_operand"
200
  (ior (match_operand 0 "shift_qi_operand")
201
       (match_operand 0 "register_operand")))
202
 
203
;; HI Helper
204
(define_predicate "shift_hi_operand"
205
   (match_code "const_int")
206
{
207
        return (IN_RAN(INTVAL (op), 0, 15) ) ? 1 : 0 ;
208
})
209
 
210
;;HI Reg, subreg(reg) or const_int.
211
(define_predicate "shift_reg_hi_int_operand"
212
  (ior (match_operand 0 "shift_hi_operand")
213
       (match_operand 0 "register_operand")))
214
 
215
;; SI Helper
216
(define_predicate "shift_si_operand"
217
   (match_code "const_int")
218
{
219
        return (IN_RAN(INTVAL (op), 0, 31) ) ? 1 : 0;
220
})
221
 
222
;;SI Reg, subreg(reg) or const_int.
223
(define_predicate "shift_reg_si_int_operand"
224
  (ior (match_operand 0 "shift_si_operand")
225
       (match_operand 0 "register_operand")))

powered by: WebSVN 2.1.0

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