111
|
1 ;; Predicates of machine description for CR16.
|
131
|
2 ;; Copyright (C) 2012-2018 Free Software Foundation, Inc.
|
111
|
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 ;; <http://www.gnu.org/licenses/>.
|
|
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")))
|