164 int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
165 int s = $2 - lshift;
166 int r = (rshift - lshift) & $2;
167 __ $4(as_Register($dst$$reg),
168 as_Register($src$$reg),
169 r, s);
170 %}
171
172 ins_pipe(ialu_reg_shift);
173 %}')
174 BFM_INSN(L, 63, RShift, sbfm)
175 BFM_INSN(I, 31, RShift, sbfmw)
176 BFM_INSN(L, 63, URShift, ubfm)
177 BFM_INSN(I, 31, URShift, ubfmw)
178 dnl
179 // Bitfield extract with shift & mask
180 define(`BFX_INSN',
181 `instruct $3$1(iReg$1NoSp dst, iReg$1`'ORL2I($1) src, immI rshift, imm$1_bitmask mask)
182 %{
183 match(Set dst (And$1 ($2$1 src rshift) mask));
184
185 ins_cost(INSN_COST);
186 format %{ "$3 $dst, $src, $mask" %}
187 ins_encode %{
188 int rshift = $rshift$$constant;
189 long mask = $mask$$constant;
190 int width = exact_log2(mask+1);
191 __ $3(as_Register($dst$$reg),
192 as_Register($src$$reg), rshift, width);
193 %}
194 ins_pipe(ialu_reg_shift);
195 %}')
196 BFX_INSN(I,URShift,ubfxw)
197 BFX_INSN(L,URShift,ubfx)
198
199 // We can use ubfx when extending an And with a mask when we know mask
200 // is positive. We know that because immI_bitmask guarantees it.
201 instruct ubfxIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI rshift, immI_bitmask mask)
202 %{
203 match(Set dst (ConvI2L (AndI (URShiftI src rshift) mask)));
204
205 ins_cost(INSN_COST * 2);
206 format %{ "ubfx $dst, $src, $mask" %}
207 ins_encode %{
208 int rshift = $rshift$$constant;
209 long mask = $mask$$constant;
210 int width = exact_log2(mask+1);
211 __ ubfx(as_Register($dst$$reg),
212 as_Register($src$$reg), rshift, width);
213 %}
214 ins_pipe(ialu_reg_shift);
215 %}
216
217 // Rotations
218
219 define(`EXTRACT_INSN',
220 `instruct extr$3$1(iReg$1NoSp dst, iReg$1`'ORL2I($1) src1, iReg$1`'ORL2I($1) src2, immI lshift, immI rshift, rFlagsReg cr)
221 %{
222 match(Set dst ($3$1 (LShift$1 src1 lshift) (URShift$1 src2 rshift)));
223 predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & $2));
224
225 ins_cost(INSN_COST);
226 format %{ "extr $dst, $src1, $src2, #$rshift" %}
227
228 ins_encode %{
|
164 int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
165 int s = $2 - lshift;
166 int r = (rshift - lshift) & $2;
167 __ $4(as_Register($dst$$reg),
168 as_Register($src$$reg),
169 r, s);
170 %}
171
172 ins_pipe(ialu_reg_shift);
173 %}')
174 BFM_INSN(L, 63, RShift, sbfm)
175 BFM_INSN(I, 31, RShift, sbfmw)
176 BFM_INSN(L, 63, URShift, ubfm)
177 BFM_INSN(I, 31, URShift, ubfmw)
178 dnl
179 // Bitfield extract with shift & mask
180 define(`BFX_INSN',
181 `instruct $3$1(iReg$1NoSp dst, iReg$1`'ORL2I($1) src, immI rshift, imm$1_bitmask mask)
182 %{
183 match(Set dst (And$1 ($2$1 src rshift) mask));
184 // Make sure we are not going to exceed what $3 can do.
185 predicate((exact_log2$6(n->in(2)->get_$5() + 1) + (n->in(1)->in(2)->get_int() & $4)) <= ($4 + 1));
186
187 ins_cost(INSN_COST);
188 format %{ "$3 $dst, $src, $mask" %}
189 ins_encode %{
190 int rshift = $rshift$$constant & $4;
191 long mask = $mask$$constant;
192 int width = exact_log2$6(mask+1);
193 __ $3(as_Register($dst$$reg),
194 as_Register($src$$reg), rshift, width);
195 %}
196 ins_pipe(ialu_reg_shift);
197 %}')
198 BFX_INSN(I, URShift, ubfxw, 31, int)
199 BFX_INSN(L, URShift, ubfx, 63, long, _long)
200
201 // We can use ubfx when extending an And with a mask when we know mask
202 // is positive. We know that because immI_bitmask guarantees it.
203 instruct ubfxIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI rshift, immI_bitmask mask)
204 %{
205 match(Set dst (ConvI2L (AndI (URShiftI src rshift) mask)));
206 // Make sure we are not going to exceed what ubfxw can do.
207 predicate((exact_log2(n->in(1)->in(2)->get_int() + 1) + (n->in(1)->in(1)->in(2)->get_int() & 31)) <= (31 + 1));
208
209 ins_cost(INSN_COST * 2);
210 format %{ "ubfx $dst, $src, $mask" %}
211 ins_encode %{
212 int rshift = $rshift$$constant & 31;
213 long mask = $mask$$constant;
214 int width = exact_log2(mask+1);
215 __ ubfx(as_Register($dst$$reg),
216 as_Register($src$$reg), rshift, width);
217 %}
218 ins_pipe(ialu_reg_shift);
219 %}
220
221 // Rotations
222
223 define(`EXTRACT_INSN',
224 `instruct extr$3$1(iReg$1NoSp dst, iReg$1`'ORL2I($1) src1, iReg$1`'ORL2I($1) src2, immI lshift, immI rshift, rFlagsReg cr)
225 %{
226 match(Set dst ($3$1 (LShift$1 src1 lshift) (URShift$1 src2 rshift)));
227 predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & $2));
228
229 ins_cost(INSN_COST);
230 format %{ "extr $dst, $src1, $src2, #$rshift" %}
231
232 ins_encode %{
|