4761
|
1 //
|
4950
|
2 // Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
4761
|
3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 //
|
|
5 // This code is free software; you can redistribute it and/or modify it
|
|
6 // under the terms of the GNU General Public License version 2 only, as
|
|
7 // published by the Free Software Foundation.
|
|
8 //
|
|
9 // This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 // version 2 for more details (a copy is included in the LICENSE file that
|
|
13 // accompanied this code).
|
|
14 //
|
|
15 // You should have received a copy of the GNU General Public License version
|
|
16 // 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 //
|
|
19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
20 // or visit www.oracle.com if you need additional information or have any
|
|
21 // questions.
|
|
22 //
|
|
23 //
|
|
24
|
|
25 // X86 Common Architecture Description File
|
|
26
|
|
27 source %{
|
|
28 // Float masks come from different places depending on platform.
|
|
29 #ifdef _LP64
|
|
30 static address float_signmask() { return StubRoutines::x86::float_sign_mask(); }
|
|
31 static address float_signflip() { return StubRoutines::x86::float_sign_flip(); }
|
|
32 static address double_signmask() { return StubRoutines::x86::double_sign_mask(); }
|
|
33 static address double_signflip() { return StubRoutines::x86::double_sign_flip(); }
|
|
34 #else
|
|
35 static address float_signmask() { return (address)float_signmask_pool; }
|
|
36 static address float_signflip() { return (address)float_signflip_pool; }
|
|
37 static address double_signmask() { return (address)double_signmask_pool; }
|
|
38 static address double_signflip() { return (address)double_signflip_pool; }
|
|
39 #endif
|
4950
|
40
|
|
41 #ifndef PRODUCT
|
|
42 void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const {
|
|
43 st->print("nop \t# %d bytes pad for loops and calls", _count);
|
|
44 }
|
|
45 #endif
|
|
46
|
|
47 void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc*) const {
|
|
48 MacroAssembler _masm(&cbuf);
|
|
49 __ nop(_count);
|
|
50 }
|
|
51
|
|
52 uint MachNopNode::size(PhaseRegAlloc*) const {
|
|
53 return _count;
|
|
54 }
|
|
55
|
|
56 #ifndef PRODUCT
|
|
57 void MachBreakpointNode::format(PhaseRegAlloc*, outputStream* st) const {
|
|
58 st->print("# breakpoint");
|
|
59 }
|
|
60 #endif
|
|
61
|
|
62 void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc* ra_) const {
|
|
63 MacroAssembler _masm(&cbuf);
|
|
64 __ int3();
|
|
65 }
|
|
66
|
|
67 uint MachBreakpointNode::size(PhaseRegAlloc* ra_) const {
|
|
68 return MachNode::size(ra_);
|
|
69 }
|
|
70
|
|
71 %}
|
|
72
|
|
73 encode %{
|
|
74
|
|
75 enc_class preserve_SP %{
|
|
76 debug_only(int off0 = cbuf.insts_size());
|
|
77 MacroAssembler _masm(&cbuf);
|
|
78 // RBP is preserved across all calls, even compiled calls.
|
|
79 // Use it to preserve RSP in places where the callee might change the SP.
|
|
80 __ movptr(rbp_mh_SP_save, rsp);
|
|
81 debug_only(int off1 = cbuf.insts_size());
|
|
82 assert(off1 - off0 == preserve_SP_size(), "correct size prediction");
|
|
83 %}
|
|
84
|
|
85 enc_class restore_SP %{
|
|
86 MacroAssembler _masm(&cbuf);
|
|
87 __ movptr(rsp, rbp_mh_SP_save);
|
|
88 %}
|
|
89
|
|
90 enc_class call_epilog %{
|
|
91 if (VerifyStackAtCalls) {
|
|
92 // Check that stack depth is unchanged: find majik cookie on stack
|
|
93 int framesize = ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3*VMRegImpl::slots_per_word));
|
|
94 MacroAssembler _masm(&cbuf);
|
|
95 Label L;
|
|
96 __ cmpptr(Address(rsp, framesize), (int32_t)0xbadb100d);
|
|
97 __ jccb(Assembler::equal, L);
|
|
98 // Die if stack mismatch
|
|
99 __ int3();
|
|
100 __ bind(L);
|
|
101 }
|
|
102 %}
|
|
103
|
4761
|
104 %}
|
|
105
|
|
106 // INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit)
|
|
107
|
4950
|
108 // ============================================================================
|
|
109
|
|
110 instruct ShouldNotReachHere() %{
|
|
111 match(Halt);
|
|
112 format %{ "int3\t# ShouldNotReachHere" %}
|
|
113 ins_encode %{
|
|
114 __ int3();
|
|
115 %}
|
|
116 ins_pipe(pipe_slow);
|
|
117 %}
|
|
118
|
|
119 // ============================================================================
|
|
120
|
4761
|
121 instruct addF_reg(regF dst, regF src) %{
|
|
122 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
123 match(Set dst (AddF dst src));
|
|
124
|
|
125 format %{ "addss $dst, $src" %}
|
|
126 ins_cost(150);
|
|
127 ins_encode %{
|
|
128 __ addss($dst$$XMMRegister, $src$$XMMRegister);
|
|
129 %}
|
|
130 ins_pipe(pipe_slow);
|
|
131 %}
|
|
132
|
|
133 instruct addF_mem(regF dst, memory src) %{
|
|
134 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
135 match(Set dst (AddF dst (LoadF src)));
|
|
136
|
|
137 format %{ "addss $dst, $src" %}
|
|
138 ins_cost(150);
|
|
139 ins_encode %{
|
|
140 __ addss($dst$$XMMRegister, $src$$Address);
|
|
141 %}
|
|
142 ins_pipe(pipe_slow);
|
|
143 %}
|
|
144
|
|
145 instruct addF_imm(regF dst, immF con) %{
|
|
146 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
147 match(Set dst (AddF dst con));
|
|
148 format %{ "addss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
149 ins_cost(150);
|
|
150 ins_encode %{
|
|
151 __ addss($dst$$XMMRegister, $constantaddress($con));
|
|
152 %}
|
|
153 ins_pipe(pipe_slow);
|
|
154 %}
|
|
155
|
|
156 instruct vaddF_reg(regF dst, regF src1, regF src2) %{
|
|
157 predicate(UseAVX > 0);
|
|
158 match(Set dst (AddF src1 src2));
|
|
159
|
|
160 format %{ "vaddss $dst, $src1, $src2" %}
|
|
161 ins_cost(150);
|
|
162 ins_encode %{
|
|
163 __ vaddss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
164 %}
|
|
165 ins_pipe(pipe_slow);
|
|
166 %}
|
|
167
|
|
168 instruct vaddF_mem(regF dst, regF src1, memory src2) %{
|
|
169 predicate(UseAVX > 0);
|
|
170 match(Set dst (AddF src1 (LoadF src2)));
|
|
171
|
|
172 format %{ "vaddss $dst, $src1, $src2" %}
|
|
173 ins_cost(150);
|
|
174 ins_encode %{
|
|
175 __ vaddss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
176 %}
|
|
177 ins_pipe(pipe_slow);
|
|
178 %}
|
|
179
|
|
180 instruct vaddF_imm(regF dst, regF src, immF con) %{
|
|
181 predicate(UseAVX > 0);
|
|
182 match(Set dst (AddF src con));
|
|
183
|
|
184 format %{ "vaddss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
185 ins_cost(150);
|
|
186 ins_encode %{
|
|
187 __ vaddss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
188 %}
|
|
189 ins_pipe(pipe_slow);
|
|
190 %}
|
|
191
|
|
192 instruct addD_reg(regD dst, regD src) %{
|
|
193 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
194 match(Set dst (AddD dst src));
|
|
195
|
|
196 format %{ "addsd $dst, $src" %}
|
|
197 ins_cost(150);
|
|
198 ins_encode %{
|
|
199 __ addsd($dst$$XMMRegister, $src$$XMMRegister);
|
|
200 %}
|
|
201 ins_pipe(pipe_slow);
|
|
202 %}
|
|
203
|
|
204 instruct addD_mem(regD dst, memory src) %{
|
|
205 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
206 match(Set dst (AddD dst (LoadD src)));
|
|
207
|
|
208 format %{ "addsd $dst, $src" %}
|
|
209 ins_cost(150);
|
|
210 ins_encode %{
|
|
211 __ addsd($dst$$XMMRegister, $src$$Address);
|
|
212 %}
|
|
213 ins_pipe(pipe_slow);
|
|
214 %}
|
|
215
|
|
216 instruct addD_imm(regD dst, immD con) %{
|
|
217 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
218 match(Set dst (AddD dst con));
|
|
219 format %{ "addsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
220 ins_cost(150);
|
|
221 ins_encode %{
|
|
222 __ addsd($dst$$XMMRegister, $constantaddress($con));
|
|
223 %}
|
|
224 ins_pipe(pipe_slow);
|
|
225 %}
|
|
226
|
|
227 instruct vaddD_reg(regD dst, regD src1, regD src2) %{
|
|
228 predicate(UseAVX > 0);
|
|
229 match(Set dst (AddD src1 src2));
|
|
230
|
|
231 format %{ "vaddsd $dst, $src1, $src2" %}
|
|
232 ins_cost(150);
|
|
233 ins_encode %{
|
|
234 __ vaddsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
235 %}
|
|
236 ins_pipe(pipe_slow);
|
|
237 %}
|
|
238
|
|
239 instruct vaddD_mem(regD dst, regD src1, memory src2) %{
|
|
240 predicate(UseAVX > 0);
|
|
241 match(Set dst (AddD src1 (LoadD src2)));
|
|
242
|
|
243 format %{ "vaddsd $dst, $src1, $src2" %}
|
|
244 ins_cost(150);
|
|
245 ins_encode %{
|
|
246 __ vaddsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
247 %}
|
|
248 ins_pipe(pipe_slow);
|
|
249 %}
|
|
250
|
|
251 instruct vaddD_imm(regD dst, regD src, immD con) %{
|
|
252 predicate(UseAVX > 0);
|
|
253 match(Set dst (AddD src con));
|
|
254
|
|
255 format %{ "vaddsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
256 ins_cost(150);
|
|
257 ins_encode %{
|
|
258 __ vaddsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
259 %}
|
|
260 ins_pipe(pipe_slow);
|
|
261 %}
|
|
262
|
|
263 instruct subF_reg(regF dst, regF src) %{
|
|
264 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
265 match(Set dst (SubF dst src));
|
|
266
|
|
267 format %{ "subss $dst, $src" %}
|
|
268 ins_cost(150);
|
|
269 ins_encode %{
|
|
270 __ subss($dst$$XMMRegister, $src$$XMMRegister);
|
|
271 %}
|
|
272 ins_pipe(pipe_slow);
|
|
273 %}
|
|
274
|
|
275 instruct subF_mem(regF dst, memory src) %{
|
|
276 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
277 match(Set dst (SubF dst (LoadF src)));
|
|
278
|
|
279 format %{ "subss $dst, $src" %}
|
|
280 ins_cost(150);
|
|
281 ins_encode %{
|
|
282 __ subss($dst$$XMMRegister, $src$$Address);
|
|
283 %}
|
|
284 ins_pipe(pipe_slow);
|
|
285 %}
|
|
286
|
|
287 instruct subF_imm(regF dst, immF con) %{
|
|
288 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
289 match(Set dst (SubF dst con));
|
|
290 format %{ "subss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
291 ins_cost(150);
|
|
292 ins_encode %{
|
|
293 __ subss($dst$$XMMRegister, $constantaddress($con));
|
|
294 %}
|
|
295 ins_pipe(pipe_slow);
|
|
296 %}
|
|
297
|
|
298 instruct vsubF_reg(regF dst, regF src1, regF src2) %{
|
|
299 predicate(UseAVX > 0);
|
|
300 match(Set dst (SubF src1 src2));
|
|
301
|
|
302 format %{ "vsubss $dst, $src1, $src2" %}
|
|
303 ins_cost(150);
|
|
304 ins_encode %{
|
|
305 __ vsubss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
306 %}
|
|
307 ins_pipe(pipe_slow);
|
|
308 %}
|
|
309
|
|
310 instruct vsubF_mem(regF dst, regF src1, memory src2) %{
|
|
311 predicate(UseAVX > 0);
|
|
312 match(Set dst (SubF src1 (LoadF src2)));
|
|
313
|
|
314 format %{ "vsubss $dst, $src1, $src2" %}
|
|
315 ins_cost(150);
|
|
316 ins_encode %{
|
|
317 __ vsubss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
318 %}
|
|
319 ins_pipe(pipe_slow);
|
|
320 %}
|
|
321
|
|
322 instruct vsubF_imm(regF dst, regF src, immF con) %{
|
|
323 predicate(UseAVX > 0);
|
|
324 match(Set dst (SubF src con));
|
|
325
|
|
326 format %{ "vsubss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
327 ins_cost(150);
|
|
328 ins_encode %{
|
|
329 __ vsubss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
330 %}
|
|
331 ins_pipe(pipe_slow);
|
|
332 %}
|
|
333
|
|
334 instruct subD_reg(regD dst, regD src) %{
|
|
335 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
336 match(Set dst (SubD dst src));
|
|
337
|
|
338 format %{ "subsd $dst, $src" %}
|
|
339 ins_cost(150);
|
|
340 ins_encode %{
|
|
341 __ subsd($dst$$XMMRegister, $src$$XMMRegister);
|
|
342 %}
|
|
343 ins_pipe(pipe_slow);
|
|
344 %}
|
|
345
|
|
346 instruct subD_mem(regD dst, memory src) %{
|
|
347 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
348 match(Set dst (SubD dst (LoadD src)));
|
|
349
|
|
350 format %{ "subsd $dst, $src" %}
|
|
351 ins_cost(150);
|
|
352 ins_encode %{
|
|
353 __ subsd($dst$$XMMRegister, $src$$Address);
|
|
354 %}
|
|
355 ins_pipe(pipe_slow);
|
|
356 %}
|
|
357
|
|
358 instruct subD_imm(regD dst, immD con) %{
|
|
359 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
360 match(Set dst (SubD dst con));
|
|
361 format %{ "subsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
362 ins_cost(150);
|
|
363 ins_encode %{
|
|
364 __ subsd($dst$$XMMRegister, $constantaddress($con));
|
|
365 %}
|
|
366 ins_pipe(pipe_slow);
|
|
367 %}
|
|
368
|
|
369 instruct vsubD_reg(regD dst, regD src1, regD src2) %{
|
|
370 predicate(UseAVX > 0);
|
|
371 match(Set dst (SubD src1 src2));
|
|
372
|
|
373 format %{ "vsubsd $dst, $src1, $src2" %}
|
|
374 ins_cost(150);
|
|
375 ins_encode %{
|
|
376 __ vsubsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
377 %}
|
|
378 ins_pipe(pipe_slow);
|
|
379 %}
|
|
380
|
|
381 instruct vsubD_mem(regD dst, regD src1, memory src2) %{
|
|
382 predicate(UseAVX > 0);
|
|
383 match(Set dst (SubD src1 (LoadD src2)));
|
|
384
|
|
385 format %{ "vsubsd $dst, $src1, $src2" %}
|
|
386 ins_cost(150);
|
|
387 ins_encode %{
|
|
388 __ vsubsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
389 %}
|
|
390 ins_pipe(pipe_slow);
|
|
391 %}
|
|
392
|
|
393 instruct vsubD_imm(regD dst, regD src, immD con) %{
|
|
394 predicate(UseAVX > 0);
|
|
395 match(Set dst (SubD src con));
|
|
396
|
|
397 format %{ "vsubsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
398 ins_cost(150);
|
|
399 ins_encode %{
|
|
400 __ vsubsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
401 %}
|
|
402 ins_pipe(pipe_slow);
|
|
403 %}
|
|
404
|
|
405 instruct mulF_reg(regF dst, regF src) %{
|
|
406 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
407 match(Set dst (MulF dst src));
|
|
408
|
|
409 format %{ "mulss $dst, $src" %}
|
|
410 ins_cost(150);
|
|
411 ins_encode %{
|
|
412 __ mulss($dst$$XMMRegister, $src$$XMMRegister);
|
|
413 %}
|
|
414 ins_pipe(pipe_slow);
|
|
415 %}
|
|
416
|
|
417 instruct mulF_mem(regF dst, memory src) %{
|
|
418 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
419 match(Set dst (MulF dst (LoadF src)));
|
|
420
|
|
421 format %{ "mulss $dst, $src" %}
|
|
422 ins_cost(150);
|
|
423 ins_encode %{
|
|
424 __ mulss($dst$$XMMRegister, $src$$Address);
|
|
425 %}
|
|
426 ins_pipe(pipe_slow);
|
|
427 %}
|
|
428
|
|
429 instruct mulF_imm(regF dst, immF con) %{
|
|
430 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
431 match(Set dst (MulF dst con));
|
|
432 format %{ "mulss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
433 ins_cost(150);
|
|
434 ins_encode %{
|
|
435 __ mulss($dst$$XMMRegister, $constantaddress($con));
|
|
436 %}
|
|
437 ins_pipe(pipe_slow);
|
|
438 %}
|
|
439
|
|
440 instruct vmulF_reg(regF dst, regF src1, regF src2) %{
|
|
441 predicate(UseAVX > 0);
|
|
442 match(Set dst (MulF src1 src2));
|
|
443
|
|
444 format %{ "vmulss $dst, $src1, $src2" %}
|
|
445 ins_cost(150);
|
|
446 ins_encode %{
|
|
447 __ vmulss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
448 %}
|
|
449 ins_pipe(pipe_slow);
|
|
450 %}
|
|
451
|
|
452 instruct vmulF_mem(regF dst, regF src1, memory src2) %{
|
|
453 predicate(UseAVX > 0);
|
|
454 match(Set dst (MulF src1 (LoadF src2)));
|
|
455
|
|
456 format %{ "vmulss $dst, $src1, $src2" %}
|
|
457 ins_cost(150);
|
|
458 ins_encode %{
|
|
459 __ vmulss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
460 %}
|
|
461 ins_pipe(pipe_slow);
|
|
462 %}
|
|
463
|
|
464 instruct vmulF_imm(regF dst, regF src, immF con) %{
|
|
465 predicate(UseAVX > 0);
|
|
466 match(Set dst (MulF src con));
|
|
467
|
|
468 format %{ "vmulss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
469 ins_cost(150);
|
|
470 ins_encode %{
|
|
471 __ vmulss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
472 %}
|
|
473 ins_pipe(pipe_slow);
|
|
474 %}
|
|
475
|
|
476 instruct mulD_reg(regD dst, regD src) %{
|
|
477 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
478 match(Set dst (MulD dst src));
|
|
479
|
|
480 format %{ "mulsd $dst, $src" %}
|
|
481 ins_cost(150);
|
|
482 ins_encode %{
|
|
483 __ mulsd($dst$$XMMRegister, $src$$XMMRegister);
|
|
484 %}
|
|
485 ins_pipe(pipe_slow);
|
|
486 %}
|
|
487
|
|
488 instruct mulD_mem(regD dst, memory src) %{
|
|
489 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
490 match(Set dst (MulD dst (LoadD src)));
|
|
491
|
|
492 format %{ "mulsd $dst, $src" %}
|
|
493 ins_cost(150);
|
|
494 ins_encode %{
|
|
495 __ mulsd($dst$$XMMRegister, $src$$Address);
|
|
496 %}
|
|
497 ins_pipe(pipe_slow);
|
|
498 %}
|
|
499
|
|
500 instruct mulD_imm(regD dst, immD con) %{
|
|
501 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
502 match(Set dst (MulD dst con));
|
|
503 format %{ "mulsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
504 ins_cost(150);
|
|
505 ins_encode %{
|
|
506 __ mulsd($dst$$XMMRegister, $constantaddress($con));
|
|
507 %}
|
|
508 ins_pipe(pipe_slow);
|
|
509 %}
|
|
510
|
|
511 instruct vmulD_reg(regD dst, regD src1, regD src2) %{
|
|
512 predicate(UseAVX > 0);
|
|
513 match(Set dst (MulD src1 src2));
|
|
514
|
|
515 format %{ "vmulsd $dst, $src1, $src2" %}
|
|
516 ins_cost(150);
|
|
517 ins_encode %{
|
|
518 __ vmulsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
519 %}
|
|
520 ins_pipe(pipe_slow);
|
|
521 %}
|
|
522
|
|
523 instruct vmulD_mem(regD dst, regD src1, memory src2) %{
|
|
524 predicate(UseAVX > 0);
|
|
525 match(Set dst (MulD src1 (LoadD src2)));
|
|
526
|
|
527 format %{ "vmulsd $dst, $src1, $src2" %}
|
|
528 ins_cost(150);
|
|
529 ins_encode %{
|
|
530 __ vmulsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
531 %}
|
|
532 ins_pipe(pipe_slow);
|
|
533 %}
|
|
534
|
|
535 instruct vmulD_imm(regD dst, regD src, immD con) %{
|
|
536 predicate(UseAVX > 0);
|
|
537 match(Set dst (MulD src con));
|
|
538
|
|
539 format %{ "vmulsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
540 ins_cost(150);
|
|
541 ins_encode %{
|
|
542 __ vmulsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
543 %}
|
|
544 ins_pipe(pipe_slow);
|
|
545 %}
|
|
546
|
|
547 instruct divF_reg(regF dst, regF src) %{
|
|
548 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
549 match(Set dst (DivF dst src));
|
|
550
|
|
551 format %{ "divss $dst, $src" %}
|
|
552 ins_cost(150);
|
|
553 ins_encode %{
|
|
554 __ divss($dst$$XMMRegister, $src$$XMMRegister);
|
|
555 %}
|
|
556 ins_pipe(pipe_slow);
|
|
557 %}
|
|
558
|
|
559 instruct divF_mem(regF dst, memory src) %{
|
|
560 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
561 match(Set dst (DivF dst (LoadF src)));
|
|
562
|
|
563 format %{ "divss $dst, $src" %}
|
|
564 ins_cost(150);
|
|
565 ins_encode %{
|
|
566 __ divss($dst$$XMMRegister, $src$$Address);
|
|
567 %}
|
|
568 ins_pipe(pipe_slow);
|
|
569 %}
|
|
570
|
|
571 instruct divF_imm(regF dst, immF con) %{
|
|
572 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
573 match(Set dst (DivF dst con));
|
|
574 format %{ "divss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
575 ins_cost(150);
|
|
576 ins_encode %{
|
|
577 __ divss($dst$$XMMRegister, $constantaddress($con));
|
|
578 %}
|
|
579 ins_pipe(pipe_slow);
|
|
580 %}
|
|
581
|
|
582 instruct vdivF_reg(regF dst, regF src1, regF src2) %{
|
|
583 predicate(UseAVX > 0);
|
|
584 match(Set dst (DivF src1 src2));
|
|
585
|
|
586 format %{ "vdivss $dst, $src1, $src2" %}
|
|
587 ins_cost(150);
|
|
588 ins_encode %{
|
|
589 __ vdivss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
590 %}
|
|
591 ins_pipe(pipe_slow);
|
|
592 %}
|
|
593
|
|
594 instruct vdivF_mem(regF dst, regF src1, memory src2) %{
|
|
595 predicate(UseAVX > 0);
|
|
596 match(Set dst (DivF src1 (LoadF src2)));
|
|
597
|
|
598 format %{ "vdivss $dst, $src1, $src2" %}
|
|
599 ins_cost(150);
|
|
600 ins_encode %{
|
|
601 __ vdivss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
602 %}
|
|
603 ins_pipe(pipe_slow);
|
|
604 %}
|
|
605
|
|
606 instruct vdivF_imm(regF dst, regF src, immF con) %{
|
|
607 predicate(UseAVX > 0);
|
|
608 match(Set dst (DivF src con));
|
|
609
|
|
610 format %{ "vdivss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
611 ins_cost(150);
|
|
612 ins_encode %{
|
|
613 __ vdivss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
614 %}
|
|
615 ins_pipe(pipe_slow);
|
|
616 %}
|
|
617
|
|
618 instruct divD_reg(regD dst, regD src) %{
|
|
619 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
620 match(Set dst (DivD dst src));
|
|
621
|
|
622 format %{ "divsd $dst, $src" %}
|
|
623 ins_cost(150);
|
|
624 ins_encode %{
|
|
625 __ divsd($dst$$XMMRegister, $src$$XMMRegister);
|
|
626 %}
|
|
627 ins_pipe(pipe_slow);
|
|
628 %}
|
|
629
|
|
630 instruct divD_mem(regD dst, memory src) %{
|
|
631 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
632 match(Set dst (DivD dst (LoadD src)));
|
|
633
|
|
634 format %{ "divsd $dst, $src" %}
|
|
635 ins_cost(150);
|
|
636 ins_encode %{
|
|
637 __ divsd($dst$$XMMRegister, $src$$Address);
|
|
638 %}
|
|
639 ins_pipe(pipe_slow);
|
|
640 %}
|
|
641
|
|
642 instruct divD_imm(regD dst, immD con) %{
|
|
643 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
644 match(Set dst (DivD dst con));
|
|
645 format %{ "divsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
646 ins_cost(150);
|
|
647 ins_encode %{
|
|
648 __ divsd($dst$$XMMRegister, $constantaddress($con));
|
|
649 %}
|
|
650 ins_pipe(pipe_slow);
|
|
651 %}
|
|
652
|
|
653 instruct vdivD_reg(regD dst, regD src1, regD src2) %{
|
|
654 predicate(UseAVX > 0);
|
|
655 match(Set dst (DivD src1 src2));
|
|
656
|
|
657 format %{ "vdivsd $dst, $src1, $src2" %}
|
|
658 ins_cost(150);
|
|
659 ins_encode %{
|
|
660 __ vdivsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
|
|
661 %}
|
|
662 ins_pipe(pipe_slow);
|
|
663 %}
|
|
664
|
|
665 instruct vdivD_mem(regD dst, regD src1, memory src2) %{
|
|
666 predicate(UseAVX > 0);
|
|
667 match(Set dst (DivD src1 (LoadD src2)));
|
|
668
|
|
669 format %{ "vdivsd $dst, $src1, $src2" %}
|
|
670 ins_cost(150);
|
|
671 ins_encode %{
|
|
672 __ vdivsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
|
|
673 %}
|
|
674 ins_pipe(pipe_slow);
|
|
675 %}
|
|
676
|
|
677 instruct vdivD_imm(regD dst, regD src, immD con) %{
|
|
678 predicate(UseAVX > 0);
|
|
679 match(Set dst (DivD src con));
|
|
680
|
|
681 format %{ "vdivsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
682 ins_cost(150);
|
|
683 ins_encode %{
|
|
684 __ vdivsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
|
|
685 %}
|
|
686 ins_pipe(pipe_slow);
|
|
687 %}
|
|
688
|
|
689 instruct absF_reg(regF dst) %{
|
|
690 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
691 match(Set dst (AbsF dst));
|
|
692 ins_cost(150);
|
|
693 format %{ "andps $dst, [0x7fffffff]\t# abs float by sign masking" %}
|
|
694 ins_encode %{
|
|
695 __ andps($dst$$XMMRegister, ExternalAddress(float_signmask()));
|
|
696 %}
|
|
697 ins_pipe(pipe_slow);
|
|
698 %}
|
|
699
|
|
700 instruct vabsF_reg(regF dst, regF src) %{
|
|
701 predicate(UseAVX > 0);
|
|
702 match(Set dst (AbsF src));
|
|
703 ins_cost(150);
|
|
704 format %{ "vandps $dst, $src, [0x7fffffff]\t# abs float by sign masking" %}
|
|
705 ins_encode %{
|
|
706 __ vandps($dst$$XMMRegister, $src$$XMMRegister,
|
|
707 ExternalAddress(float_signmask()));
|
|
708 %}
|
|
709 ins_pipe(pipe_slow);
|
|
710 %}
|
|
711
|
|
712 instruct absD_reg(regD dst) %{
|
|
713 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
714 match(Set dst (AbsD dst));
|
|
715 ins_cost(150);
|
|
716 format %{ "andpd $dst, [0x7fffffffffffffff]\t"
|
|
717 "# abs double by sign masking" %}
|
|
718 ins_encode %{
|
|
719 __ andpd($dst$$XMMRegister, ExternalAddress(double_signmask()));
|
|
720 %}
|
|
721 ins_pipe(pipe_slow);
|
|
722 %}
|
|
723
|
|
724 instruct vabsD_reg(regD dst, regD src) %{
|
|
725 predicate(UseAVX > 0);
|
|
726 match(Set dst (AbsD src));
|
|
727 ins_cost(150);
|
|
728 format %{ "vandpd $dst, $src, [0x7fffffffffffffff]\t"
|
|
729 "# abs double by sign masking" %}
|
|
730 ins_encode %{
|
|
731 __ vandpd($dst$$XMMRegister, $src$$XMMRegister,
|
|
732 ExternalAddress(double_signmask()));
|
|
733 %}
|
|
734 ins_pipe(pipe_slow);
|
|
735 %}
|
|
736
|
|
737 instruct negF_reg(regF dst) %{
|
|
738 predicate((UseSSE>=1) && (UseAVX == 0));
|
|
739 match(Set dst (NegF dst));
|
|
740 ins_cost(150);
|
|
741 format %{ "xorps $dst, [0x80000000]\t# neg float by sign flipping" %}
|
|
742 ins_encode %{
|
|
743 __ xorps($dst$$XMMRegister, ExternalAddress(float_signflip()));
|
|
744 %}
|
|
745 ins_pipe(pipe_slow);
|
|
746 %}
|
|
747
|
|
748 instruct vnegF_reg(regF dst, regF src) %{
|
|
749 predicate(UseAVX > 0);
|
|
750 match(Set dst (NegF src));
|
|
751 ins_cost(150);
|
|
752 format %{ "vxorps $dst, $src, [0x80000000]\t# neg float by sign flipping" %}
|
|
753 ins_encode %{
|
|
754 __ vxorps($dst$$XMMRegister, $src$$XMMRegister,
|
|
755 ExternalAddress(float_signflip()));
|
|
756 %}
|
|
757 ins_pipe(pipe_slow);
|
|
758 %}
|
|
759
|
|
760 instruct negD_reg(regD dst) %{
|
|
761 predicate((UseSSE>=2) && (UseAVX == 0));
|
|
762 match(Set dst (NegD dst));
|
|
763 ins_cost(150);
|
|
764 format %{ "xorpd $dst, [0x8000000000000000]\t"
|
|
765 "# neg double by sign flipping" %}
|
|
766 ins_encode %{
|
|
767 __ xorpd($dst$$XMMRegister, ExternalAddress(double_signflip()));
|
|
768 %}
|
|
769 ins_pipe(pipe_slow);
|
|
770 %}
|
|
771
|
|
772 instruct vnegD_reg(regD dst, regD src) %{
|
|
773 predicate(UseAVX > 0);
|
|
774 match(Set dst (NegD src));
|
|
775 ins_cost(150);
|
|
776 format %{ "vxorpd $dst, $src, [0x8000000000000000]\t"
|
|
777 "# neg double by sign flipping" %}
|
|
778 ins_encode %{
|
|
779 __ vxorpd($dst$$XMMRegister, $src$$XMMRegister,
|
|
780 ExternalAddress(double_signflip()));
|
|
781 %}
|
|
782 ins_pipe(pipe_slow);
|
|
783 %}
|
|
784
|
|
785 instruct sqrtF_reg(regF dst, regF src) %{
|
|
786 predicate(UseSSE>=1);
|
|
787 match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
|
|
788
|
|
789 format %{ "sqrtss $dst, $src" %}
|
|
790 ins_cost(150);
|
|
791 ins_encode %{
|
|
792 __ sqrtss($dst$$XMMRegister, $src$$XMMRegister);
|
|
793 %}
|
|
794 ins_pipe(pipe_slow);
|
|
795 %}
|
|
796
|
|
797 instruct sqrtF_mem(regF dst, memory src) %{
|
|
798 predicate(UseSSE>=1);
|
|
799 match(Set dst (ConvD2F (SqrtD (ConvF2D (LoadF src)))));
|
|
800
|
|
801 format %{ "sqrtss $dst, $src" %}
|
|
802 ins_cost(150);
|
|
803 ins_encode %{
|
|
804 __ sqrtss($dst$$XMMRegister, $src$$Address);
|
|
805 %}
|
|
806 ins_pipe(pipe_slow);
|
|
807 %}
|
|
808
|
|
809 instruct sqrtF_imm(regF dst, immF con) %{
|
|
810 predicate(UseSSE>=1);
|
|
811 match(Set dst (ConvD2F (SqrtD (ConvF2D con))));
|
|
812 format %{ "sqrtss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
|
|
813 ins_cost(150);
|
|
814 ins_encode %{
|
|
815 __ sqrtss($dst$$XMMRegister, $constantaddress($con));
|
|
816 %}
|
|
817 ins_pipe(pipe_slow);
|
|
818 %}
|
|
819
|
|
820 instruct sqrtD_reg(regD dst, regD src) %{
|
|
821 predicate(UseSSE>=2);
|
|
822 match(Set dst (SqrtD src));
|
|
823
|
|
824 format %{ "sqrtsd $dst, $src" %}
|
|
825 ins_cost(150);
|
|
826 ins_encode %{
|
|
827 __ sqrtsd($dst$$XMMRegister, $src$$XMMRegister);
|
|
828 %}
|
|
829 ins_pipe(pipe_slow);
|
|
830 %}
|
|
831
|
|
832 instruct sqrtD_mem(regD dst, memory src) %{
|
|
833 predicate(UseSSE>=2);
|
|
834 match(Set dst (SqrtD (LoadD src)));
|
|
835
|
|
836 format %{ "sqrtsd $dst, $src" %}
|
|
837 ins_cost(150);
|
|
838 ins_encode %{
|
|
839 __ sqrtsd($dst$$XMMRegister, $src$$Address);
|
|
840 %}
|
|
841 ins_pipe(pipe_slow);
|
|
842 %}
|
|
843
|
|
844 instruct sqrtD_imm(regD dst, immD con) %{
|
|
845 predicate(UseSSE>=2);
|
|
846 match(Set dst (SqrtD con));
|
|
847 format %{ "sqrtsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
|
|
848 ins_cost(150);
|
|
849 ins_encode %{
|
|
850 __ sqrtsd($dst$$XMMRegister, $constantaddress($con));
|
|
851 %}
|
|
852 ins_pipe(pipe_slow);
|
|
853 %}
|
|
854
|