annotate src/cpu/x86/vm/x86_32.ad @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 4ca6dc0799b6
children 89152779163c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 //
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
2 // Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 //
a61af66fc99e Initial load
duke
parents:
diff changeset
5 // This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 // under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 // published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 //
a61af66fc99e Initial load
duke
parents:
diff changeset
9 // This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 // version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 // accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 //
a61af66fc99e Initial load
duke
parents:
diff changeset
15 // You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 // 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 //
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1396
diff changeset
19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1396
diff changeset
20 // or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1396
diff changeset
21 // questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 //
a61af66fc99e Initial load
duke
parents:
diff changeset
23 //
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // X86 Architecture Description File
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 //----------REGISTER DEFINITION BLOCK------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // This information is used by the matcher and the register allocator to
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // describe individual registers and classes of registers within the target
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // archtecture.
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 register %{
a61af66fc99e Initial load
duke
parents:
diff changeset
33 //----------Architecture Description Register Definitions----------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // General Registers
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // "reg_def" name ( register save type, C convention save type,
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // ideal register type, encoding );
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Register Save Types:
a61af66fc99e Initial load
duke
parents:
diff changeset
38 //
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // NS = No-Save: The register allocator assumes that these registers
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // can be used without saving upon entry to the method, &
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // that they do not need to be saved at call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // SOC = Save-On-Call: The register allocator assumes that these registers
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // can be used without saving upon entry to the method,
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // but that they must be saved at call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // SOE = Save-On-Entry: The register allocator assumes that these registers
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // must be saved before using them upon entry to the
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // method, but they do not need to be saved at call
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // AS = Always-Save: The register allocator assumes that these registers
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // must be saved before using them upon entry to the
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // method, & that they must be saved at call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
55 //
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Ideal Register Type is used to determine how to save & restore a
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // spilled with LoadP/StoreP. If the register supports both, use Op_RegI.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // The encoding number is the actual bit-pattern placed into the opcodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // General Registers
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Previously set EBX, ESI, and EDI as save-on-entry for java code
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Turn off SOE in java-code due to frequent use of uncommon-traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Now that allocator is better, turn on ESI and EDI as SOE registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 reg_def EBX(SOC, SOE, Op_RegI, 3, rbx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
68 reg_def ECX(SOC, SOC, Op_RegI, 1, rcx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
69 reg_def ESI(SOC, SOE, Op_RegI, 6, rsi->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
70 reg_def EDI(SOC, SOE, Op_RegI, 7, rdi->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // now that adapter frames are gone EBP is always saved and restored by the prolog/epilog code
a61af66fc99e Initial load
duke
parents:
diff changeset
72 reg_def EBP(NS, SOE, Op_RegI, 5, rbp->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
73 reg_def EDX(SOC, SOC, Op_RegI, 2, rdx->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
74 reg_def EAX(SOC, SOC, Op_RegI, 0, rax->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
75 reg_def ESP( NS, NS, Op_RegI, 4, rsp->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Float registers. We treat TOS/FPR0 special. It is invisible to the
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // allocator, and only shows up in the encodings.
a61af66fc99e Initial load
duke
parents:
diff changeset
79 reg_def FPR0L( SOC, SOC, Op_RegF, 0, VMRegImpl::Bad());
a61af66fc99e Initial load
duke
parents:
diff changeset
80 reg_def FPR0H( SOC, SOC, Op_RegF, 0, VMRegImpl::Bad());
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Ok so here's the trick FPR1 is really st(0) except in the midst
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // of emission of assembly for a machnode. During the emission the fpu stack
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // is pushed making FPR1 == st(1) temporarily. However at any safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // the stack will not have this element so FPR1 == st(0) from the
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // oopMap viewpoint. This same weirdness with numbering causes
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // instruction encoding to have to play games with the register
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // encode to correct for this 0/1 issue. See MachSpillCopyNode::implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // where it does flt->flt moves to see an example
a61af66fc99e Initial load
duke
parents:
diff changeset
89 //
a61af66fc99e Initial load
duke
parents:
diff changeset
90 reg_def FPR1L( SOC, SOC, Op_RegF, 1, as_FloatRegister(0)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
91 reg_def FPR1H( SOC, SOC, Op_RegF, 1, as_FloatRegister(0)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
92 reg_def FPR2L( SOC, SOC, Op_RegF, 2, as_FloatRegister(1)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
93 reg_def FPR2H( SOC, SOC, Op_RegF, 2, as_FloatRegister(1)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
94 reg_def FPR3L( SOC, SOC, Op_RegF, 3, as_FloatRegister(2)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
95 reg_def FPR3H( SOC, SOC, Op_RegF, 3, as_FloatRegister(2)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
96 reg_def FPR4L( SOC, SOC, Op_RegF, 4, as_FloatRegister(3)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
97 reg_def FPR4H( SOC, SOC, Op_RegF, 4, as_FloatRegister(3)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
98 reg_def FPR5L( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
99 reg_def FPR5H( SOC, SOC, Op_RegF, 5, as_FloatRegister(4)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
100 reg_def FPR6L( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
101 reg_def FPR6H( SOC, SOC, Op_RegF, 6, as_FloatRegister(5)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
102 reg_def FPR7L( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg());
a61af66fc99e Initial load
duke
parents:
diff changeset
103 reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Specify priority of register selection within phases of register
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // allocation. Highest priority is first. A useful heuristic is to
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // give registers a low priority when they are required by machine
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // instructions, like EAX and EDX. Registers which are used as
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
109 // pairs must fall on an even boundary (witness the FPR#L's in this list).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // For the Intel integer registers, the equivalent Long pairs are
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // EDX:EAX, EBX:ECX, and EDI:EBP.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 alloc_class chunk0( ECX, EBX, EBP, EDI, EAX, EDX, ESI, ESP,
a61af66fc99e Initial load
duke
parents:
diff changeset
113 FPR0L, FPR0H, FPR1L, FPR1H, FPR2L, FPR2H,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 FPR3L, FPR3H, FPR4L, FPR4H, FPR5L, FPR5H,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 FPR6L, FPR6H, FPR7L, FPR7H );
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 //----------Architecture Description Register Classes--------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // Several register classes are automatically defined based upon information in
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // this architecture description.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // 1) reg_class inline_cache_reg ( /* as def'd in frame section */ )
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // 2) reg_class compiler_method_oop_reg ( /* as def'd in frame section */ )
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // 2) reg_class interpreter_method_oop_reg ( /* as def'd in frame section */ )
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // 3) reg_class stack_slots( /* one chunk of stack-based "registers" */ )
a61af66fc99e Initial load
duke
parents:
diff changeset
125 //
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Class for all registers
a61af66fc99e Initial load
duke
parents:
diff changeset
127 reg_class any_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX, ESP);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // Class for general registers
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
129 reg_class int_reg(EAX, EDX, EBP, EDI, ESI, ECX, EBX);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Class for general registers which may be used for implicit null checks on win95
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Also safe for use by tailjump. We don't want to allocate in rbp,
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
132 reg_class int_reg_no_rbp(EAX, EDX, EDI, ESI, ECX, EBX);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // Class of "X" registers
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
134 reg_class int_x_reg(EBX, ECX, EDX, EAX);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Class of registers that can appear in an address with no offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // EBP and ESP require an extra instruction byte for zero offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Used in fast-unlock
a61af66fc99e Initial load
duke
parents:
diff changeset
138 reg_class p_reg(EDX, EDI, ESI, EBX);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Class for general registers not including ECX
a61af66fc99e Initial load
duke
parents:
diff changeset
140 reg_class ncx_reg(EAX, EDX, EBP, EDI, ESI, EBX);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Class for general registers not including EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
142 reg_class nax_reg(EDX, EDI, ESI, ECX, EBX);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Class for general registers not including EAX or EBX.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 reg_class nabx_reg(EDX, EDI, ESI, ECX, EBP);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Class of EAX (for multiply and divide operations)
a61af66fc99e Initial load
duke
parents:
diff changeset
146 reg_class eax_reg(EAX);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Class of EBX (for atomic add)
a61af66fc99e Initial load
duke
parents:
diff changeset
148 reg_class ebx_reg(EBX);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Class of ECX (for shift and JCXZ operations and cmpLTMask)
a61af66fc99e Initial load
duke
parents:
diff changeset
150 reg_class ecx_reg(ECX);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Class of EDX (for multiply and divide operations)
a61af66fc99e Initial load
duke
parents:
diff changeset
152 reg_class edx_reg(EDX);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Class of EDI (for synchronization)
a61af66fc99e Initial load
duke
parents:
diff changeset
154 reg_class edi_reg(EDI);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Class of ESI (for synchronization)
a61af66fc99e Initial load
duke
parents:
diff changeset
156 reg_class esi_reg(ESI);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Singleton class for interpreter's stack pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
158 reg_class ebp_reg(EBP);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Singleton class for stack pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
160 reg_class sp_reg(ESP);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Singleton class for instruction pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // reg_class ip_reg(EIP);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Class of integer register pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
164 reg_class long_reg( EAX,EDX, ECX,EBX, EBP,EDI );
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Class of integer register pairs that aligns with calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
166 reg_class eadx_reg( EAX,EDX );
a61af66fc99e Initial load
duke
parents:
diff changeset
167 reg_class ebcx_reg( ECX,EBX );
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Not AX or DX, used in divides
a61af66fc99e Initial load
duke
parents:
diff changeset
169 reg_class nadx_reg( EBX,ECX,ESI,EDI,EBP );
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Floating point registers. Notice FPR0 is not a choice.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // FPR0 is not ever allocated; we use clever encodings to fake
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // a 2-address instructions out of Intels FP stack.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
174 reg_class fp_flt_reg( FPR1L,FPR2L,FPR3L,FPR4L,FPR5L,FPR6L,FPR7L );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
175
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
176 reg_class fp_dbl_reg( FPR1L,FPR1H, FPR2L,FPR2H, FPR3L,FPR3H,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
177 FPR4L,FPR4H, FPR5L,FPR5H, FPR6L,FPR6H,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
178 FPR7L,FPR7H );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
180 reg_class fp_flt_reg0( FPR1L );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
181 reg_class fp_dbl_reg0( FPR1L,FPR1H );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
182 reg_class fp_dbl_reg1( FPR2L,FPR2H );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
183 reg_class fp_dbl_notreg0( FPR2L,FPR2H, FPR3L,FPR3H, FPR4L,FPR4H,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
184 FPR5L,FPR5H, FPR6L,FPR6H, FPR7L,FPR7H );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
185
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 //----------SOURCE BLOCK-------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // This is a block of C++ code which provides values, functions, and
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // definitions necessary in the rest of the architecture description
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
192 source_hpp %{
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
193 // Must be visible to the DFA in dfa_x86_32.cpp
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
194 extern bool is_operand_hi32_zero(Node* n);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
195 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
196
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 source %{
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
198 #define RELOC_IMM32 Assembler::imm_operand
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #define RELOC_DISP32 Assembler::disp32_operand
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #define __ _masm.
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // How to find the high register of a Long pair, given the low register
a61af66fc99e Initial load
duke
parents:
diff changeset
204 #define HIGH_FROM_LOW(x) ((x)+2)
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // These masks are used to provide 128-bit aligned bitmasks to the XMM
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // instructions, to allow sign-masking or sign-bit flipping. They allow
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // fast versions of NegF/NegD and AbsF/AbsD.
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Note: 'double' and 'long long' have 32-bits alignment on x86.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Use the expression (adr)&(~0xF) to provide 128-bits aligned address
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // of 128-bits operands for SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
214 jlong *operand = (jlong*)(((uintptr_t)adr)&((uintptr_t)(~0xF)));
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Store the value to a 128-bits operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 operand[0] = lo;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 operand[1] = hi;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return operand;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Buffer for 128-bits masks used by SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 static jlong fp_signmask_pool[(4+1)*2]; // 4*128bits(data) + 128bits(alignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Static initialization during VM startup.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 static jlong *float_signmask_pool = double_quadword(&fp_signmask_pool[1*2], CONST64(0x7FFFFFFF7FFFFFFF), CONST64(0x7FFFFFFF7FFFFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
226 static jlong *double_signmask_pool = double_quadword(&fp_signmask_pool[2*2], CONST64(0x7FFFFFFFFFFFFFFF), CONST64(0x7FFFFFFFFFFFFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
227 static jlong *float_signflip_pool = double_quadword(&fp_signmask_pool[3*2], CONST64(0x8000000080000000), CONST64(0x8000000080000000));
a61af66fc99e Initial load
duke
parents:
diff changeset
228 static jlong *double_signflip_pool = double_quadword(&fp_signmask_pool[4*2], CONST64(0x8000000000000000), CONST64(0x8000000000000000));
a61af66fc99e Initial load
duke
parents:
diff changeset
229
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
230 // Offset hacking within calls.
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
231 static int pre_call_resets_size() {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
232 int size = 0;
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
233 Compile* C = Compile::current();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
234 if (C->in_24_bit_fp_mode()) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
235 size += 6; // fldcw
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
236 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
237 if (C->max_vector_size() > 16) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
238 size += 3; // vzeroupper
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
239 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
240 return size;
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
241 }
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
242
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
243 static int preserve_SP_size() {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
244 return 2; // op, rm(reg/reg)
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
245 }
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
246
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // !!!!! Special hack to get all type of calls to specify the byte offset
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // from the start of the call to the point where the return address
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // will point.
a61af66fc99e Initial load
duke
parents:
diff changeset
250 int MachCallStaticJavaNode::ret_addr_offset() {
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
251 int offset = 5 + pre_call_resets_size(); // 5 bytes from start of call to where return address points
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
252 if (_method_handle_invoke)
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
253 offset += preserve_SP_size();
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
254 return offset;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 int MachCallDynamicJavaNode::ret_addr_offset() {
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
258 return 10 + pre_call_resets_size(); // 10 bytes from start of call to where return address points
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 static int sizeof_FFree_Float_Stack_All = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 int MachCallRuntimeNode::ret_addr_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 assert(sizeof_FFree_Float_Stack_All != -1, "must have been emitted already");
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
265 return sizeof_FFree_Float_Stack_All + 5 + pre_call_resets_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // Indicate if the safepoint node needs the polling page as an input.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Since x86 does have absolute addressing, it doesn't.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 bool SafePointNode::needs_polling_address_input() {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 //
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // Compute padding required for nodes which need alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
276 //
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // The address of the call instruction needs to be 4-byte aligned to
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // ensure that it does not span a cache line so that it can be patched.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 int CallStaticJavaDirectNode::compute_padding(int current_offset) const {
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
281 current_offset += pre_call_resets_size(); // skip fldcw, if any
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
282 current_offset += 1; // skip call opcode byte
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
283 return round_to(current_offset, alignment_required()) - current_offset;
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
284 }
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
285
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
286 // The address of the call instruction needs to be 4-byte aligned to
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
287 // ensure that it does not span a cache line so that it can be patched.
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
288 int CallStaticJavaHandleNode::compute_padding(int current_offset) const {
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
289 current_offset += pre_call_resets_size(); // skip fldcw, if any
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
290 current_offset += preserve_SP_size(); // skip mov rbp, rsp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291 current_offset += 1; // skip call opcode byte
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return round_to(current_offset, alignment_required()) - current_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // The address of the call instruction needs to be 4-byte aligned to
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // ensure that it does not span a cache line so that it can be patched.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 int CallDynamicJavaDirectNode::compute_padding(int current_offset) const {
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
298 current_offset += pre_call_resets_size(); // skip fldcw, if any
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299 current_offset += 5; // skip MOV instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
300 current_offset += 1; // skip call opcode byte
a61af66fc99e Initial load
duke
parents:
diff changeset
301 return round_to(current_offset, alignment_required()) - current_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // EMIT_RM()
a61af66fc99e Initial load
duke
parents:
diff changeset
305 void emit_rm(CodeBuffer &cbuf, int f1, int f2, int f3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 unsigned char c = (unsigned char)((f1 << 6) | (f2 << 3) | f3);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
307 cbuf.insts()->emit_int8(c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // EMIT_CC()
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void emit_cc(CodeBuffer &cbuf, int f1, int f2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 unsigned char c = (unsigned char)( f1 | f2 );
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
313 cbuf.insts()->emit_int8(c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // EMIT_OPCODE()
a61af66fc99e Initial load
duke
parents:
diff changeset
317 void emit_opcode(CodeBuffer &cbuf, int code) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
318 cbuf.insts()->emit_int8((unsigned char) code);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // EMIT_OPCODE() w/ relocation information
a61af66fc99e Initial load
duke
parents:
diff changeset
322 void emit_opcode(CodeBuffer &cbuf, int code, relocInfo::relocType reloc, int offset = 0) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
323 cbuf.relocate(cbuf.insts_mark() + offset, reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 emit_opcode(cbuf, code);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // EMIT_D8()
a61af66fc99e Initial load
duke
parents:
diff changeset
328 void emit_d8(CodeBuffer &cbuf, int d8) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
329 cbuf.insts()->emit_int8((unsigned char) d8);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // EMIT_D16()
a61af66fc99e Initial load
duke
parents:
diff changeset
333 void emit_d16(CodeBuffer &cbuf, int d16) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
334 cbuf.insts()->emit_int16(d16);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // EMIT_D32()
a61af66fc99e Initial load
duke
parents:
diff changeset
338 void emit_d32(CodeBuffer &cbuf, int d32) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
339 cbuf.insts()->emit_int32(d32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // emit 32 bit value and construct relocation entry from relocInfo::relocType
a61af66fc99e Initial load
duke
parents:
diff changeset
343 void emit_d32_reloc(CodeBuffer &cbuf, int d32, relocInfo::relocType reloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
344 int format) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
345 cbuf.relocate(cbuf.insts_mark(), reloc, format);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
346 cbuf.insts()->emit_int32(d32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // emit 32 bit value and construct relocation entry from RelocationHolder
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void emit_d32_reloc(CodeBuffer &cbuf, int d32, RelocationHolder const& rspec,
a61af66fc99e Initial load
duke
parents:
diff changeset
351 int format) {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (rspec.reloc()->type() == relocInfo::oop_type && d32 != 0 && d32 != (int)Universe::non_oop_word()) {
12316
190899198332 7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents: 10169
diff changeset
354 assert(cast_to_oop(d32)->is_oop() && (ScavengeRootsInCode || !cast_to_oop(d32)->is_scavengable()), "cannot embed scavengable oops in code");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 #endif
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
357 cbuf.relocate(cbuf.insts_mark(), rspec, format);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
358 cbuf.insts()->emit_int32(d32);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Access stack slot for load or store
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void store_to_stackslot(CodeBuffer &cbuf, int opcode, int rm_field, int disp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 emit_opcode( cbuf, opcode ); // (e.g., FILD [ESP+src])
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if( -128 <= disp && disp <= 127 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 emit_rm( cbuf, 0x01, rm_field, ESP_enc ); // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
366 emit_rm( cbuf, 0x00, ESP_enc, ESP_enc); // SIB byte
a61af66fc99e Initial load
duke
parents:
diff changeset
367 emit_d8 (cbuf, disp); // Displacement // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
368 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 emit_rm( cbuf, 0x02, rm_field, ESP_enc ); // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
370 emit_rm( cbuf, 0x00, ESP_enc, ESP_enc); // SIB byte
a61af66fc99e Initial load
duke
parents:
diff changeset
371 emit_d32(cbuf, disp); // Displacement // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
375 // rRegI ereg, memory mem) %{ // emit_reg_mem
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
376 void encode_RegMem( CodeBuffer &cbuf, int reg_encoding, int base, int index, int scale, int displace, relocInfo::relocType disp_reloc ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // There is no index & no scale, use form without SIB byte
a61af66fc99e Initial load
duke
parents:
diff changeset
378 if ((index == 0x4) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
379 (scale == 0) && (base != ESP_enc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // If no displacement, mode is 0x0; unless base is [EBP]
a61af66fc99e Initial load
duke
parents:
diff changeset
381 if ( (displace == 0) && (base != EBP_enc) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 emit_rm(cbuf, 0x0, reg_encoding, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 else { // If 8-bit displacement, mode 0x1
a61af66fc99e Initial load
duke
parents:
diff changeset
385 if ((displace >= -128) && (displace <= 127)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
386 && (disp_reloc == relocInfo::none) ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 emit_rm(cbuf, 0x1, reg_encoding, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 emit_d8(cbuf, displace);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
390 else { // If 32-bit displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (base == -1) { // Special flag for absolute address
a61af66fc99e Initial load
duke
parents:
diff changeset
392 emit_rm(cbuf, 0x0, reg_encoding, 0x5);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // (manual lies; no SIB needed here)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
394 if ( disp_reloc != relocInfo::none ) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
395 emit_d32_reloc(cbuf, displace, disp_reloc, 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 emit_d32 (cbuf, displace);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 else { // Normal base + offset
a61af66fc99e Initial load
duke
parents:
diff changeset
401 emit_rm(cbuf, 0x2, reg_encoding, base);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
402 if ( disp_reloc != relocInfo::none ) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
403 emit_d32_reloc(cbuf, displace, disp_reloc, 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
404 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 emit_d32 (cbuf, displace);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 else { // Else, encode with the SIB byte
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // If no displacement, mode is 0x0; unless base is [EBP]
a61af66fc99e Initial load
duke
parents:
diff changeset
413 if (displace == 0 && (base != EBP_enc)) { // If no displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
414 emit_rm(cbuf, 0x0, reg_encoding, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 emit_rm(cbuf, scale, index, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417 else { // If 8-bit displacement, mode 0x1
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if ((displace >= -128) && (displace <= 127)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
419 && (disp_reloc == relocInfo::none) ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 emit_rm(cbuf, 0x1, reg_encoding, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 emit_rm(cbuf, scale, index, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 emit_d8(cbuf, displace);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 else { // If 32-bit displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
425 if (base == 0x04 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 emit_rm(cbuf, 0x2, reg_encoding, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 emit_rm(cbuf, scale, index, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 emit_rm(cbuf, 0x2, reg_encoding, 0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 emit_rm(cbuf, scale, index, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
432 if ( disp_reloc != relocInfo::none ) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
433 emit_d32_reloc(cbuf, displace, disp_reloc, 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 emit_d32 (cbuf, displace);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 void encode_Copy( CodeBuffer &cbuf, int dst_encoding, int src_encoding ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 if( dst_encoding == src_encoding ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // reg-reg copy, use an empty encoding
a61af66fc99e Initial load
duke
parents:
diff changeset
446 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 emit_opcode( cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
448 emit_rm(cbuf, 0x3, dst_encoding, src_encoding );
a61af66fc99e Initial load
duke
parents:
diff changeset
449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
452 void emit_cmpfp_fixup(MacroAssembler& _masm) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
453 Label exit;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
454 __ jccb(Assembler::noParity, exit);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
455 __ pushf();
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
456 //
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
457 // comiss/ucomiss instructions set ZF,PF,CF flags and
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
458 // zero OF,AF,SF for NaN values.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
459 // Fixup flags by zeroing ZF,PF so that compare of NaN
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
460 // values returns 'less than' result (CF is set).
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
461 // Leave the rest of flags unchanged.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
462 //
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
463 // 7 6 5 4 3 2 1 0
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
464 // |S|Z|r|A|r|P|r|C| (r - reserved bit)
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
465 // 0 0 1 0 1 0 1 1 (0x2B)
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
466 //
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
467 __ andl(Address(rsp, 0), 0xffffff2b);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
468 __ popf();
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
469 __ bind(exit);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
470 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
471
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
472 void emit_cmpfp3(MacroAssembler& _masm, Register dst) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
473 Label done;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
474 __ movl(dst, -1);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
475 __ jcc(Assembler::parity, done);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
476 __ jcc(Assembler::below, done);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
477 __ setb(Assembler::notEqual, dst);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
478 __ movzbl(dst, dst);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
479 __ bind(done);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 //=============================================================================
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
484 const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
485
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
486 int Compile::ConstantTable::calculate_table_base_offset() const {
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
487 return 0; // absolute addressing, no offset
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
488 }
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
489
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
490 void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
491 // Empty encoding
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
492 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
493
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
494 uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
495 return 0;
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
496 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
497
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
498 #ifndef PRODUCT
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
499 void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
500 st->print("# MachConstantBaseNode (empty encoding)");
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
501 }
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
502 #endif
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
503
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
504
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
505 //=============================================================================
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506 #ifndef PRODUCT
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
507 void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
508 Compile* C = ra_->C;
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 int framesize = C->frame_slots() << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
512 // Remove wordSize for return addr which is already pushed.
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
513 framesize -= wordSize;
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
514
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515 if (C->need_stack_bang(framesize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 framesize -= wordSize;
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
517 st->print("# stack bang");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
518 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
519 st->print("PUSH EBP\t# Save EBP");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
520 if (framesize) {
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
521 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
522 st->print("SUB ESP, #%d\t# Create frame",framesize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 } else {
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
525 st->print("SUB ESP, #%d\t# Create frame",framesize);
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
526 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
527 framesize -= wordSize;
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
528 st->print("MOV [ESP + #%d], EBP\t# Save EBP",framesize);
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
529 }
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
530
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
531 if (VerifyStackAtCalls) {
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
532 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
533 framesize -= wordSize;
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
534 st->print("MOV [ESP + #%d], 0xBADB100D\t# Majik cookie for stack depth check",framesize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
536
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
537 if( C->in_24_bit_fp_mode() ) {
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
538 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
539 st->print("FLDCW \t# load 24 bit fpu control word");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
540 }
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
541 if (UseSSE >= 2 && VerifyFPU) {
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
542 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
543 st->print("# verify FPU stack (must be clean on entry)");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
544 }
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
545
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
546 #ifdef ASSERT
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
547 if (VerifyStackAtCalls) {
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
548 st->print("\n\t");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
549 st->print("# stack alignment check");
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
550 }
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
551 #endif
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
552 st->cr();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 Compile* C = ra_->C;
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
559 MacroAssembler _masm(&cbuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 int framesize = C->frame_slots() << LogBytesPerInt;
4947
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
562
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
563 __ verified_entry(framesize, C->need_stack_bang(framesize), C->in_24_bit_fp_mode());
fd8114661503 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
kvn
parents: 4777
diff changeset
564
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
565 C->set_frame_complete(cbuf.insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566
4114
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
567 if (C->has_mach_constant_base_node()) {
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
568 // NOTE: We set the table base offset here because users might be
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
569 // emitted before MachConstantBaseNode.
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
570 Compile::ConstantTable& constant_table = C->constant_table();
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
571 constant_table.set_table_base_offset(constant_table.calculate_table_base_offset());
6729bbc1fcd6 7003454: order constants in constant table by number of references in code
twisti
parents: 4047
diff changeset
572 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 uint MachPrologNode::size(PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 return MachNode::size(ra_); // too many variables; just compute it the hard way
a61af66fc99e Initial load
duke
parents:
diff changeset
577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 int MachPrologNode::reloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 return 0; // a large enough number
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
584 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
585 void MachEpilogNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 Compile *C = ra_->C;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 int framesize = C->frame_slots() << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // Remove two words for return addr and rbp,
a61af66fc99e Initial load
duke
parents:
diff changeset
590 framesize -= 2*wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
591
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
592 if (C->max_vector_size() > 16) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
593 st->print("VZEROUPPER");
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
594 st->cr(); st->print("\t");
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
595 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
596 if (C->in_24_bit_fp_mode()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
597 st->print("FLDCW standard control word");
a61af66fc99e Initial load
duke
parents:
diff changeset
598 st->cr(); st->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
600 if (framesize) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601 st->print("ADD ESP,%d\t# Destroy frame",framesize);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 st->cr(); st->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 st->print_cr("POPL EBP"); st->print("\t");
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
605 if (do_polling() && C->is_method_compilation()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
606 st->print("TEST PollPage,EAX\t! Poll Safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
607 st->cr(); st->print("\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 Compile *C = ra_->C;
a61af66fc99e Initial load
duke
parents:
diff changeset
614
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
615 if (C->max_vector_size() > 16) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
616 // Clear upper bits of YMM registers when current compiled code uses
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
617 // wide vectors to avoid AVX <-> SSE transition penalty during call.
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
618 MacroAssembler masm(&cbuf);
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
619 masm.vzeroupper();
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
620 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // If method set FPU control word, restore to standard control word
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
622 if (C->in_24_bit_fp_mode()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623 MacroAssembler masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 masm.fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 int framesize = C->frame_slots() << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Remove two words for return addr and rbp,
a61af66fc99e Initial load
duke
parents:
diff changeset
630 framesize -= 2*wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here
a61af66fc99e Initial load
duke
parents:
diff changeset
633
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
634 if (framesize >= 128) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 emit_opcode(cbuf, 0x81); // add SP, #framesize
a61af66fc99e Initial load
duke
parents:
diff changeset
636 emit_rm(cbuf, 0x3, 0x00, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 emit_d32(cbuf, framesize);
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
638 } else if (framesize) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 emit_opcode(cbuf, 0x83); // add SP, #framesize
a61af66fc99e Initial load
duke
parents:
diff changeset
640 emit_rm(cbuf, 0x3, 0x00, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 emit_d8(cbuf, framesize);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 emit_opcode(cbuf, 0x58 | EBP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
645
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
646 if (do_polling() && C->is_method_compilation()) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
647 cbuf.relocate(cbuf.insts_end(), relocInfo::poll_return_type, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
648 emit_opcode(cbuf,0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
649 emit_rm(cbuf, 0x0, EAX_enc, 0x5); // EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
650 emit_d32(cbuf, (intptr_t)os::get_polling_page());
a61af66fc99e Initial load
duke
parents:
diff changeset
651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 Compile *C = ra_->C;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // If method set FPU control word, restore to standard control word
a61af66fc99e Initial load
duke
parents:
diff changeset
657 int size = C->in_24_bit_fp_mode() ? 6 : 0;
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
658 if (C->max_vector_size() > 16) size += 3; // vzeroupper
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
659 if (do_polling() && C->is_method_compilation()) size += 6;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 int framesize = C->frame_slots() << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
662 assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Remove two words for return addr and rbp,
a61af66fc99e Initial load
duke
parents:
diff changeset
664 framesize -= 2*wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 size++; // popl rbp,
a61af66fc99e Initial load
duke
parents:
diff changeset
667
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
668 if (framesize >= 128) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669 size += 6;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 size += framesize ? 3 : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 int MachEpilogNode::reloc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 return 0; // a large enough number
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 const Pipeline * MachEpilogNode::pipeline() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
681 return MachNode::pipeline_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 int MachEpilogNode::safepoint_offset() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 enum RC { rc_bad, rc_int, rc_float, rc_xmm, rc_stack };
a61af66fc99e Initial load
duke
parents:
diff changeset
689 static enum RC rc_class( OptoReg::Name reg ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 if( !OptoReg::is_valid(reg) ) return rc_bad;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 if (OptoReg::is_stack(reg)) return rc_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 VMReg r = OptoReg::as_VMReg(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (r->is_Register()) return rc_int;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 if (r->is_FloatRegister()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 assert(UseSSE < 2, "shouldn't be used in SSE2+ mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
698 return rc_float;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 assert(r->is_XMMRegister(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
701 return rc_xmm;
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
704 static int impl_helper( CodeBuffer *cbuf, bool do_size, bool is_load, int offset, int reg,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
705 int opcode, const char *op_str, int size, outputStream* st ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
707 emit_opcode (*cbuf, opcode );
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
708 encode_RegMem(*cbuf, Matcher::_regEncode[reg], ESP_enc, 0x4, 0, offset, relocInfo::none);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
709 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
710 } else if( !do_size ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
711 if( size != 0 ) st->print("\n\t");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
712 if( opcode == 0x8B || opcode == 0x89 ) { // MOV
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
713 if( is_load ) st->print("%s %s,[ESP + #%d]",op_str,Matcher::regName[reg],offset);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
714 else st->print("%s [ESP + #%d],%s",op_str,offset,Matcher::regName[reg]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
715 } else { // FLD, FST, PUSH, POP
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
716 st->print("%s [ESP + #%d]",op_str,offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720 int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 return size+3+offset_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // Helper for XMM registers. Extra opcode bits, limited syntax.
a61af66fc99e Initial load
duke
parents:
diff changeset
725 static int impl_x_helper( CodeBuffer *cbuf, bool do_size, bool is_load,
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
726 int offset, int reg_lo, int reg_hi, int size, outputStream* st ) {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
727 if (cbuf) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
728 MacroAssembler _masm(cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
729 if (reg_lo+1 == reg_hi) { // double move?
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
730 if (is_load) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
731 __ movdbl(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
732 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
733 __ movdbl(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[reg_lo]));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
734 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 } else {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
736 if (is_load) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
737 __ movflt(as_XMMRegister(Matcher::_regEncode[reg_lo]), Address(rsp, offset));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
738 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
739 __ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[reg_lo]));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
740 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
742 #ifndef PRODUCT
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
743 } else if (!do_size) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
744 if (size != 0) st->print("\n\t");
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
745 if (reg_lo+1 == reg_hi) { // double move?
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
746 if (is_load) st->print("%s %s,[ESP + #%d]",
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
747 UseXmmLoadAndClearUpper ? "MOVSD " : "MOVLPD",
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
748 Matcher::regName[reg_lo], offset);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
749 else st->print("MOVSD [ESP + #%d],%s",
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
750 offset, Matcher::regName[reg_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 } else {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
752 if (is_load) st->print("MOVSS %s,[ESP + #%d]",
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
753 Matcher::regName[reg_lo], offset);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
754 else st->print("MOVSS [ESP + #%d],%s",
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
755 offset, Matcher::regName[reg_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759 int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
760 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761 return size+5+offset_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 static int impl_movx_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
766 int src_hi, int dst_hi, int size, outputStream* st ) {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
767 if (cbuf) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
768 MacroAssembler _masm(cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
769 if (src_lo+1 == src_hi && dst_lo+1 == dst_hi) { // double move?
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
770 __ movdbl(as_XMMRegister(Matcher::_regEncode[dst_lo]),
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
771 as_XMMRegister(Matcher::_regEncode[src_lo]));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
772 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
773 __ movflt(as_XMMRegister(Matcher::_regEncode[dst_lo]),
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
774 as_XMMRegister(Matcher::_regEncode[src_lo]));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
775 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
776 #ifndef PRODUCT
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
777 } else if (!do_size) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
778 if (size != 0) st->print("\n\t");
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
779 if (UseXmmRegToRegMoveAll) {//Use movaps,movapd to move between xmm registers
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
780 if (src_lo+1 == src_hi && dst_lo+1 == dst_hi) { // double move?
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
781 st->print("MOVAPD %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782 } else {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
783 st->print("MOVAPS %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
785 } else {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
786 if( src_lo+1 == src_hi && dst_lo+1 == dst_hi ) { // double move?
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
787 st->print("MOVSD %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
788 } else {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
789 st->print("MOVSS %s,%s",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
791 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
792 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
794 // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
795 // Only MOVAPS SSE prefix uses 1 byte.
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
796 int sz = 4;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
797 if (!(src_lo+1 == src_hi && dst_lo+1 == dst_hi) &&
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
798 UseXmmRegToRegMoveAll && (UseAVX == 0)) sz = 3;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
799 return size + sz;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
1730
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
802 static int impl_movgpr2x_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
803 int src_hi, int dst_hi, int size, outputStream* st ) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
804 // 32-bit
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
805 if (cbuf) {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
806 MacroAssembler _masm(cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
807 __ movdl(as_XMMRegister(Matcher::_regEncode[dst_lo]),
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
808 as_Register(Matcher::_regEncode[src_lo]));
1730
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
809 #ifndef PRODUCT
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
810 } else if (!do_size) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
811 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
812 #endif
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
813 }
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
814 return 4;
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
815 }
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
816
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
817
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
818 static int impl_movx2gpr_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
819 int src_hi, int dst_hi, int size, outputStream* st ) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
820 // 32-bit
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
821 if (cbuf) {
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
822 MacroAssembler _masm(cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
823 __ movdl(as_Register(Matcher::_regEncode[dst_lo]),
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
824 as_XMMRegister(Matcher::_regEncode[src_lo]));
1730
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
825 #ifndef PRODUCT
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
826 } else if (!do_size) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
827 st->print("movdl %s, %s\t# spill", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
828 #endif
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
829 }
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
830 return 4;
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
831 }
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
832
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
833 static int impl_mov_helper( CodeBuffer *cbuf, bool do_size, int src, int dst, int size, outputStream* st ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 emit_opcode(*cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
836 emit_rm (*cbuf, 0x3, Matcher::_regEncode[dst], Matcher::_regEncode[src] );
a61af66fc99e Initial load
duke
parents:
diff changeset
837 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
838 } else if( !do_size ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
839 if( size != 0 ) st->print("\n\t");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
840 st->print("MOV %s,%s",Matcher::regName[dst],Matcher::regName[src]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
841 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return size+2;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
846 static int impl_fp_store_helper( CodeBuffer *cbuf, bool do_size, int src_lo, int src_hi, int dst_lo, int dst_hi,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
847 int offset, int size, outputStream* st ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if( src_lo != FPR1L_num ) { // Move value to top of FP stack, if not already there
a61af66fc99e Initial load
duke
parents:
diff changeset
849 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
850 emit_opcode( *cbuf, 0xD9 ); // FLD (i.e., push it)
a61af66fc99e Initial load
duke
parents:
diff changeset
851 emit_d8( *cbuf, 0xC0-1+Matcher::_regEncode[src_lo] );
a61af66fc99e Initial load
duke
parents:
diff changeset
852 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
853 } else if( !do_size ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
854 if( size != 0 ) st->print("\n\t");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
855 st->print("FLD %s",Matcher::regName[src_lo]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858 size += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 int st_op = (src_lo != FPR1L_num) ? EBX_num /*store & pop*/ : EDX_num /*store no pop*/;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 const char *op_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 int op;
a61af66fc99e Initial load
duke
parents:
diff changeset
864 if( src_lo+1 == src_hi && dst_lo+1 == dst_hi ) { // double store?
a61af66fc99e Initial load
duke
parents:
diff changeset
865 op_str = (src_lo != FPR1L_num) ? "FSTP_D" : "FST_D ";
a61af66fc99e Initial load
duke
parents:
diff changeset
866 op = 0xDD;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 } else { // 32-bit store
a61af66fc99e Initial load
duke
parents:
diff changeset
868 op_str = (src_lo != FPR1L_num) ? "FSTP_S" : "FST_S ";
a61af66fc99e Initial load
duke
parents:
diff changeset
869 op = 0xD9;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 assert( !OptoReg::is_valid(src_hi) && !OptoReg::is_valid(dst_hi), "no non-adjacent float-stores" );
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
873 return impl_helper(cbuf,do_size,false,offset,st_op,op,op_str,size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
875
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
876 // Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad.
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
877 static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
878 int src_hi, int dst_hi, uint ireg, outputStream* st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
879
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
880 static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
881 int stack_offset, int reg, uint ireg, outputStream* st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
882
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
883 static int vec_stack_to_stack_helper(CodeBuffer *cbuf, bool do_size, int src_offset,
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
884 int dst_offset, uint ireg, outputStream* st) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
885 int calc_size = 0;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
886 int src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
887 int dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
888 switch (ireg) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
889 case Op_VecS:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
890 calc_size = 3+src_offset_size + 3+dst_offset_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
891 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
892 case Op_VecD:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
893 calc_size = 3+src_offset_size + 3+dst_offset_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
894 src_offset += 4;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
895 dst_offset += 4;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
896 src_offset_size = (src_offset == 0) ? 0 : ((src_offset < 0x80) ? 1 : 4);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
897 dst_offset_size = (dst_offset == 0) ? 0 : ((dst_offset < 0x80) ? 1 : 4);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
898 calc_size += 3+src_offset_size + 3+dst_offset_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
899 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
900 case Op_VecX:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
901 calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
902 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
903 case Op_VecY:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
904 calc_size = 6 + 6 + 5+src_offset_size + 5+dst_offset_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
905 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
906 default:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
907 ShouldNotReachHere();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
908 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
909 if (cbuf) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
910 MacroAssembler _masm(cbuf);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
911 int offset = __ offset();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
912 switch (ireg) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
913 case Op_VecS:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
914 __ pushl(Address(rsp, src_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
915 __ popl (Address(rsp, dst_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
916 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
917 case Op_VecD:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
918 __ pushl(Address(rsp, src_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
919 __ popl (Address(rsp, dst_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
920 __ pushl(Address(rsp, src_offset+4));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
921 __ popl (Address(rsp, dst_offset+4));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
922 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
923 case Op_VecX:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
924 __ movdqu(Address(rsp, -16), xmm0);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
925 __ movdqu(xmm0, Address(rsp, src_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
926 __ movdqu(Address(rsp, dst_offset), xmm0);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
927 __ movdqu(xmm0, Address(rsp, -16));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
928 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
929 case Op_VecY:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
930 __ vmovdqu(Address(rsp, -32), xmm0);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
931 __ vmovdqu(xmm0, Address(rsp, src_offset));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
932 __ vmovdqu(Address(rsp, dst_offset), xmm0);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
933 __ vmovdqu(xmm0, Address(rsp, -32));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
934 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
935 default:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
936 ShouldNotReachHere();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
937 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
938 int size = __ offset() - offset;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
939 assert(size == calc_size, "incorrect size calculattion");
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
940 return size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
941 #ifndef PRODUCT
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
942 } else if (!do_size) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
943 switch (ireg) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
944 case Op_VecS:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
945 st->print("pushl [rsp + #%d]\t# 32-bit mem-mem spill\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
946 "popl [rsp + #%d]",
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
947 src_offset, dst_offset);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
948 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
949 case Op_VecD:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
950 st->print("pushl [rsp + #%d]\t# 64-bit mem-mem spill\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
951 "popq [rsp + #%d]\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
952 "pushl [rsp + #%d]\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
953 "popq [rsp + #%d]",
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
954 src_offset, dst_offset, src_offset+4, dst_offset+4);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
955 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
956 case Op_VecX:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
957 st->print("movdqu [rsp - #16], xmm0\t# 128-bit mem-mem spill\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
958 "movdqu xmm0, [rsp + #%d]\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
959 "movdqu [rsp + #%d], xmm0\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
960 "movdqu xmm0, [rsp - #16]",
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
961 src_offset, dst_offset);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
962 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
963 case Op_VecY:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
964 st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
965 "vmovdqu xmm0, [rsp + #%d]\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
966 "vmovdqu [rsp + #%d], xmm0\n\t"
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
967 "vmovdqu xmm0, [rsp - #32]",
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
968 src_offset, dst_offset);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
969 break;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
970 default:
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
971 ShouldNotReachHere();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
972 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
973 #endif
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
974 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
975 return calc_size;
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
976 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
977
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream* st ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // Get registers to move
a61af66fc99e Initial load
duke
parents:
diff changeset
980 OptoReg::Name src_second = ra_->get_reg_second(in(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
981 OptoReg::Name src_first = ra_->get_reg_first(in(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
982 OptoReg::Name dst_second = ra_->get_reg_second(this );
a61af66fc99e Initial load
duke
parents:
diff changeset
983 OptoReg::Name dst_first = ra_->get_reg_first(this );
a61af66fc99e Initial load
duke
parents:
diff changeset
984
a61af66fc99e Initial load
duke
parents:
diff changeset
985 enum RC src_second_rc = rc_class(src_second);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 enum RC src_first_rc = rc_class(src_first);
a61af66fc99e Initial load
duke
parents:
diff changeset
987 enum RC dst_second_rc = rc_class(dst_second);
a61af66fc99e Initial load
duke
parents:
diff changeset
988 enum RC dst_first_rc = rc_class(dst_first);
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 assert( OptoReg::is_valid(src_first) && OptoReg::is_valid(dst_first), "must move at least 1 register" );
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 // Generate spill code!
a61af66fc99e Initial load
duke
parents:
diff changeset
993 int size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 if( src_first == dst_first && src_second == dst_second )
a61af66fc99e Initial load
duke
parents:
diff changeset
996 return size; // Self copy, no move
a61af66fc99e Initial load
duke
parents:
diff changeset
997
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
998 if (bottom_type()->isa_vect() != NULL) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
999 uint ireg = ideal_reg();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1000 assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity");
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1001 assert((src_first_rc != rc_float && dst_first_rc != rc_float), "sanity");
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1002 assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY), "sanity");
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1003 if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1004 // mem -> mem
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1005 int src_offset = ra_->reg2offset(src_first);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1006 int dst_offset = ra_->reg2offset(dst_first);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1007 return vec_stack_to_stack_helper(cbuf, do_size, src_offset, dst_offset, ireg, st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1008 } else if (src_first_rc == rc_xmm && dst_first_rc == rc_xmm ) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1009 return vec_mov_helper(cbuf, do_size, src_first, dst_first, src_second, dst_second, ireg, st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1010 } else if (src_first_rc == rc_xmm && dst_first_rc == rc_stack ) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1011 int stack_offset = ra_->reg2offset(dst_first);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1012 return vec_spill_helper(cbuf, do_size, false, stack_offset, src_first, ireg, st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1013 } else if (src_first_rc == rc_stack && dst_first_rc == rc_xmm ) {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1014 int stack_offset = ra_->reg2offset(src_first);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1015 return vec_spill_helper(cbuf, do_size, true, stack_offset, dst_first, ireg, st);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1016 } else {
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1017 ShouldNotReachHere();
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1018 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1019 }
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1020
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // --------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // Check for mem-mem move. push/pop to move.
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 if( src_second == dst_first ) { // overlapping stack copy ranges
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 assert( src_second_rc == rc_stack && dst_second_rc == rc_stack, "we only expect a stk-stk copy here" );
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1026 size = impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_second),ESI_num,0xFF,"PUSH ",size, st);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1027 size = impl_helper(cbuf,do_size,false,ra_->reg2offset(dst_second),EAX_num,0x8F,"POP ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 src_second_rc = dst_second_rc = rc_bad; // flag as already moved the second bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // move low bits
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1031 size = impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_first),ESI_num,0xFF,"PUSH ",size, st);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1032 size = impl_helper(cbuf,do_size,false,ra_->reg2offset(dst_first),EAX_num,0x8F,"POP ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 if( src_second_rc == rc_stack && dst_second_rc == rc_stack ) { // mov second bits
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1034 size = impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_second),ESI_num,0xFF,"PUSH ",size, st);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1035 size = impl_helper(cbuf,do_size,false,ra_->reg2offset(dst_second),EAX_num,0x8F,"POP ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1039
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 // --------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 // Check for integer reg-reg copy
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 if( src_first_rc == rc_int && dst_first_rc == rc_int )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1043 size = impl_mov_helper(cbuf,do_size,src_first,dst_first,size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // Check for integer store
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 if( src_first_rc == rc_int && dst_first_rc == rc_stack )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1047 size = impl_helper(cbuf,do_size,false,ra_->reg2offset(dst_first),src_first,0x89,"MOV ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // Check for integer load
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 if( dst_first_rc == rc_int && src_first_rc == rc_stack )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1051 size = impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_first),dst_first,0x8B,"MOV ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
1730
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1053 // Check for integer reg-xmm reg copy
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1054 if( src_first_rc == rc_int && dst_first_rc == rc_xmm ) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1055 assert( (src_second_rc == rc_bad && dst_second_rc == rc_bad),
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1056 "no 64 bit integer-float reg moves" );
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1057 return impl_movgpr2x_helper(cbuf,do_size,src_first,dst_first,src_second, dst_second, size, st);
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1058 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // --------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // Check for float reg-reg copy
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 if( src_first_rc == rc_float && dst_first_rc == rc_float ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 assert( (src_second_rc == rc_bad && dst_second_rc == rc_bad) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 (src_first+1 == src_second && dst_first+1 == dst_second), "no non-adjacent float-moves" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 // Note the mucking with the register encode to compensate for the 0/1
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // indexing issue mentioned in a comment in the reg_def sections
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // for FPR registers many lines above here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 if( src_first != FPR1L_num ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 emit_opcode (*cbuf, 0xD9 ); // FLD ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 emit_d8 (*cbuf, 0xC0+Matcher::_regEncode[src_first]-1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 emit_opcode (*cbuf, 0xDD ); // FSTP ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 emit_d8 (*cbuf, 0xD8+Matcher::_regEncode[dst_first] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 emit_opcode (*cbuf, 0xDD ); // FST ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 emit_d8 (*cbuf, 0xD0+Matcher::_regEncode[dst_first]-1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 } else if( !do_size ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if( size != 0 ) st->print("\n\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 if( src_first != FPR1L_num ) st->print("FLD %s\n\tFSTP %s",Matcher::regName[src_first],Matcher::regName[dst_first]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 else st->print( "FST %s", Matcher::regName[dst_first]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 return size + ((src_first != FPR1L_num) ? 2+2 : 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Check for float store
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if( src_first_rc == rc_float && dst_first_rc == rc_stack ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1091 return impl_fp_store_helper(cbuf,do_size,src_first,src_second,dst_first,dst_second,ra_->reg2offset(dst_first),size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // Check for float load
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 if( dst_first_rc == rc_float && src_first_rc == rc_stack ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 int offset = ra_->reg2offset(src_first);
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 const char *op_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 int op;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 if( src_first+1 == src_second && dst_first+1 == dst_second ) { // double load?
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 op_str = "FLD_D";
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 op = 0xDD;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 } else { // 32-bit load
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 op_str = "FLD_S";
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 op = 0xD9;
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 assert( src_second_rc == rc_bad && dst_second_rc == rc_bad, "no non-adjacent float-loads" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 emit_opcode (*cbuf, op );
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
1109 encode_RegMem(*cbuf, 0x0, ESP_enc, 0x4, 0, offset, relocInfo::none);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 emit_opcode (*cbuf, 0xDD ); // FSTP ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 emit_d8 (*cbuf, 0xD8+Matcher::_regEncode[dst_first] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 } else if( !do_size ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 if( size != 0 ) st->print("\n\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 st->print("%s ST,[ESP + #%d]\n\tFSTP %s",op_str, offset,Matcher::regName[dst_first]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 int offset_size = (offset == 0) ? 0 : ((offset <= 127) ? 1 : 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 return size + 3+offset_size+2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // Check for xmm reg-reg copy
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 if( src_first_rc == rc_xmm && dst_first_rc == rc_xmm ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 assert( (src_second_rc == rc_bad && dst_second_rc == rc_bad) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 (src_first+1 == src_second && dst_first+1 == dst_second),
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 "no non-adjacent float-moves" );
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1127 return impl_movx_helper(cbuf,do_size,src_first,dst_first,src_second, dst_second, size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
1730
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1130 // Check for xmm reg-integer reg copy
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1131 if( src_first_rc == rc_xmm && dst_first_rc == rc_int ) {
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1132 assert( (src_second_rc == rc_bad && dst_second_rc == rc_bad),
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1133 "no 64 bit float-integer reg moves" );
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1134 return impl_movx2gpr_helper(cbuf,do_size,src_first,dst_first,src_second, dst_second, size, st);
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1135 }
f55c4f82ab9d 6978249: spill between cpu and fpu registers when those moves are fast
never
parents: 1579
diff changeset
1136
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // Check for xmm store
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 if( src_first_rc == rc_xmm && dst_first_rc == rc_stack ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1139 return impl_x_helper(cbuf,do_size,false,ra_->reg2offset(dst_first),src_first, src_second, size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // Check for float xmm load
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 if( dst_first_rc == rc_xmm && src_first_rc == rc_stack ) {
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1144 return impl_x_helper(cbuf,do_size,true ,ra_->reg2offset(src_first),dst_first, dst_second, size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 // Copy from float reg to xmm reg
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 if( dst_first_rc == rc_xmm && src_first_rc == rc_float ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // copy to the top of stack from floating point reg
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // and use LEA to preserve flags
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 emit_opcode(*cbuf,0x8D); // LEA ESP,[ESP-8]
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 emit_rm(*cbuf, 0x1, ESP_enc, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 emit_rm(*cbuf, 0x0, 0x04, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 emit_d8(*cbuf,0xF8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 } else if( !do_size ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if( size != 0 ) st->print("\n\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 st->print("LEA ESP,[ESP-8]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 size += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1164 size = impl_fp_store_helper(cbuf,do_size,src_first,src_second,dst_first,dst_second,0,size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 // Copy from the temp memory to the xmm reg.
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1167 size = impl_x_helper(cbuf,do_size,true ,0,dst_first, dst_second, size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 if( cbuf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 emit_opcode(*cbuf,0x8D); // LEA ESP,[ESP+8]
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 emit_rm(*cbuf, 0x1, ESP_enc, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 emit_rm(*cbuf, 0x0, 0x04, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 emit_d8(*cbuf,0x08);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 } else if( !do_size ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 if( size != 0 ) st->print("\n\t");
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 st->print("LEA ESP,[ESP+8]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 size += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 assert( size > 0, "missed a case" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // --------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // Check for second bits still needing moving.
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 if( src_second == dst_second )
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 return size; // Self copy; no move
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 assert( src_second_rc != rc_bad && dst_second_rc != rc_bad, "src_second & dst_second cannot be Bad" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // Check for second word int-int move
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 if( src_second_rc == rc_int && dst_second_rc == rc_int )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1194 return impl_mov_helper(cbuf,do_size,src_second,dst_second,size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // Check for second word integer store
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 if( src_second_rc == rc_int && dst_second_rc == rc_stack )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1198 return impl_helper(cbuf,do_size,false,ra_->reg2offset(dst_second),src_second,0x89,"MOV ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // Check for second word integer load
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 if( dst_second_rc == rc_int && src_second_rc == rc_stack )
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1202 return impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_second),dst_second,0x8B,"MOV ",size, st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 #ifndef PRODUCT
4950
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
1209 void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 implementation( NULL, ra_, false, st );
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 implementation( &cbuf, ra_, false, NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 return implementation( NULL, ra_, true, NULL );
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1221
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void BoxLockNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 int reg = ra_->get_reg_first(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 st->print("LEA %s,[ESP + #%d]",Matcher::regName[reg],offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 int reg = ra_->get_encode(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 if( offset >= 128 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 emit_opcode(cbuf, 0x8D); // LEA reg,[SP+offset]
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 emit_rm(cbuf, 0x2, reg, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 emit_rm(cbuf, 0x0, 0x04, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 emit_d32(cbuf, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 emit_opcode(cbuf, 0x8D); // LEA reg,[SP+offset]
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 emit_rm(cbuf, 0x1, reg, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 emit_rm(cbuf, 0x0, 0x04, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 emit_d8(cbuf, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 uint BoxLockNode::size(PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 if( offset >= 128 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 return 7;
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 return 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1258
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream* st ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 st->print_cr( "CMP EAX,[ECX+4]\t# Inline cache check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 st->print_cr("\tJNE SharedRuntime::handle_ic_miss_stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 st->print_cr("\tNOP");
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 st->print_cr("\tNOP");
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if( !OptoBreakpoint )
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 st->print_cr("\tNOP");
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 MacroAssembler masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 #ifdef ASSERT
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1274 uint insts_size = cbuf.insts_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
1276 masm.cmpptr(rax, Address(rcx, oopDesc::klass_offset_in_bytes()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 masm.jump_cc(Assembler::notEqual,
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 /* WARNING these NOPs are critical so that verified entry point is properly
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 aligned for patching by NativeJump::patch_verified_entry() */
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 int nops_cnt = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 if( !OptoBreakpoint ) // Leave space for int3
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 nops_cnt += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 masm.nop(nops_cnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1286 assert(cbuf.insts_size() - insts_size == size(ra_), "checking code size of inline cache node");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 uint MachUEPNode::size(PhaseRegAlloc *ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 return OptoBreakpoint ? 11 : 12;
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1292
a61af66fc99e Initial load
duke
parents:
diff changeset
1293
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 uint size_exception_handler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 // NativeCall instruction size is the same as NativeJump.
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 // exception handler starts out as jump and can be patched to
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // a call be deoptimization. (4932387)
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 // Note that this value is also credited (in output.cpp) to
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // the size of the code section.
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 return NativeJump::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 // Emit exception handler code. Stuff framesize into a register
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // and call a VM stub routine.
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 int emit_exception_handler(CodeBuffer& cbuf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1308 // Note that the code buffer's insts_mark is always relative to insts.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // That's why we must use the macroassembler to generate a handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 MacroAssembler _masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 address base =
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 __ start_a_stub(size_exception_handler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 if (base == NULL) return 0; // CodeBuffer::expand failed
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 int offset = __ offset();
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1315 __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 __ end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 uint size_deopt_handler() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 // NativeCall instruction size is the same as NativeJump.
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 // exception handler starts out as jump and can be patched to
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // a call be deoptimization. (4932387)
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 // Note that this value is also credited (in output.cpp) to
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 // the size of the code section.
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 return 5 + NativeJump::instruction_size; // pushl(); jmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1329
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 // Emit deopt handler code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 int emit_deopt_handler(CodeBuffer& cbuf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1332
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1333 // Note that the code buffer's insts_mark is always relative to insts.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 // That's why we must use the macroassembler to generate a handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 MacroAssembler _masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 address base =
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 __ start_a_stub(size_exception_handler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 if (base == NULL) return 0; // CodeBuffer::expand failed
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 int offset = __ offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 InternalAddress here(__ pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 __ pushptr(here.addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 __ end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 int Matcher::regnum_to_fpu_offset(int regnum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 return regnum - 32; // The FP registers are in the second chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 // This is UltraSparc specific, true just means we have fast l2f conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 const bool Matcher::convL2FSupported(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // Is this branch offset short enough that a short branch can be used?
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // NOTE: If the platform does not provide any short branch variants, then
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // this method should return false for offset 0.
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1362 bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1363 // The passed offset is relative to address of the branch.
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1364 // On 86 a branch displacement is calculated relative to address
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1365 // of a next instruction.
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1366 offset -= br_size;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
1367
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1368 // the short version of jmpConUCF2 contains multiple branches,
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1369 // making the reach slightly less
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1370 if (rule == jmpConUCF2_rule)
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
1371 return (-126 <= offset && offset <= 125);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 return (-128 <= offset && offset <= 127);
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1374
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 const bool Matcher::isSimpleConstant64(jlong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 // Will one (StoreL ConL) be cheaper than two (StoreI ConI)?.
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 // The ecx parameter to rep stos for the ClearArray node is in dwords.
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 const bool Matcher::init_array_count_is_in_bytes = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // Threshold size for cleararray.
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 const int Matcher::init_array_short_size = 8 * BytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1386 // Needs 2 CMOV's for longs.
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1387 const int Matcher::long_cmove_cost() { return 1; }
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1388
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1389 // No CMOVF/CMOVD with SSE/SSE2
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1390 const int Matcher::float_cmove_cost() { return (UseSSE>=1) ? ConditionalMoveLimit : 0; }
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
1391
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // Should the Matcher clone shifts on addressing modes, expecting them to
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // be subsumed into complex addressing expressions or compute them into
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // registers? True for Intel but false for most RISCs
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 const bool Matcher::clone_shift_expressions = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396
2401
7e88bdae86ec 7029017: Additional architecture support for c2 compiler
roland
parents: 2320
diff changeset
1397 // Do we need to mask the count passed to shift instructions or does
7e88bdae86ec 7029017: Additional architecture support for c2 compiler
roland
parents: 2320
diff changeset
1398 // the cpu only look at the lower 5/6 bits anyway?
7e88bdae86ec 7029017: Additional architecture support for c2 compiler
roland
parents: 2320
diff changeset
1399 const bool Matcher::need_masked_shift_count = false;
7e88bdae86ec 7029017: Additional architecture support for c2 compiler
roland
parents: 2320
diff changeset
1400
1575
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1401 bool Matcher::narrow_oop_use_complex_address() {
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1402 ShouldNotCallThis();
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1403 return true;
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1404 }
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1405
6848
8e47bac5643a 7054512: Compress class pointers after perm gen removal
roland
parents: 6795
diff changeset
1406 bool Matcher::narrow_klass_use_complex_address() {
8e47bac5643a 7054512: Compress class pointers after perm gen removal
roland
parents: 6795
diff changeset
1407 ShouldNotCallThis();
8e47bac5643a 7054512: Compress class pointers after perm gen removal
roland
parents: 6795
diff changeset
1408 return true;
8e47bac5643a 7054512: Compress class pointers after perm gen removal
roland
parents: 6795
diff changeset
1409 }
8e47bac5643a 7054512: Compress class pointers after perm gen removal
roland
parents: 6795
diff changeset
1410
1575
3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops
kvn
parents: 1567
diff changeset
1411
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // Is it better to copy float constants, or load them directly from memory?
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 // Intel can load a float constant from a direct address, requiring no
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // extra registers. Most RISCs will have to materialize an address into a
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // register first, so they would do better to copy the constant from stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 const bool Matcher::rematerialize_float_constants = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // If CPU can load and store mis-aligned doubles directly then no fixup is
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // needed. Else we split the double into 2 integer pieces and move it
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // piece-by-piece. Only happens when passing doubles into C code as the
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 // Java calling convention forces doubles to be aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 const bool Matcher::misaligned_doubles_ok = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1423
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 void Matcher::pd_implicit_null_fixup(MachNode *node, uint idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // Get the memory operand from the node
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 uint numopnds = node->num_opnds(); // Virtual call for number of operands
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 uint skipped = node->oper_input_base(); // Sum of leaves skipped so far
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 assert( idx >= skipped, "idx too low in pd_implicit_null_fixup" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 uint opcnt = 1; // First operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 uint num_edges = node->_opnds[1]->num_edges(); // leaves for first operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 while( idx >= skipped+num_edges ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 skipped += num_edges;
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 opcnt++; // Bump operand count
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 assert( opcnt < numopnds, "Accessing non-existent operand" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 num_edges = node->_opnds[opcnt]->num_edges(); // leaves for next operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 MachOper *memory = node->_opnds[opcnt];
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 MachOper *new_memory = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 switch (memory->opcode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 case DIRECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 case INDOFFSET32X:
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 // No transformation necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 case INDIRECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 new_memory = new (C) indirect_win95_safeOper( );
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 case INDOFFSET8:
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 new_memory = new (C) indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 case INDOFFSET32:
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 new_memory = new (C) indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 case INDINDEXOFFSET:
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 new_memory = new (C) indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 case INDINDEXSCALE:
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 new_memory = new (C) indIndexScale_win95_safeOper(memory->scale());
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 case INDINDEXSCALEOFFSET:
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 new_memory = new (C) indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 case LOAD_LONG_INDIRECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 case LOAD_LONG_INDOFFSET32:
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 // Does not use EBP as address register, use { EDX, EBX, EDI, ESI}
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 assert(false, "unexpected memory operand in pd_implicit_null_fixup()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 node->_opnds[opcnt] = new_memory;
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1474
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 // Advertise here if the CPU requires explicit rounding operations
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 // to implement the UseStrictFP mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 const bool Matcher::strict_fp_requires_explicit_rounding = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1478
1274
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1209
diff changeset
1479 // Are floats conerted to double when stored to stack during deoptimization?
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1209
diff changeset
1480 // On x32 it is stored with convertion only when FPU is used for floats.
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1209
diff changeset
1481 bool Matcher::float_in_double() { return (UseSSE == 0); }
2883969d09e7 6910664: C2: java/util/Arrays/Sorting.java fails with DeoptimizeALot flag
kvn
parents: 1209
diff changeset
1482
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 // Do ints take an entire long register or just half?
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 const bool Matcher::int_in_long = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // Return whether or not this register is ever used as an argument. This
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 // function is used on startup to build the trampoline stubs in generateOptoStub.
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 // Registers not mentioned will be killed by the VM call in the trampoline, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 // arguments in those registers not be available to the callee.
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 bool Matcher::can_be_java_arg( int reg ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 if( reg == ECX_num || reg == EDX_num ) return true;
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1492 if( (reg == XMM0_num || reg == XMM1_num ) && UseSSE>=1 ) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 if( (reg == XMM0b_num || reg == XMM1b_num) && UseSSE>=2 ) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1496
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 bool Matcher::is_spillable_arg( int reg ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 return can_be_java_arg(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1501 bool Matcher::use_asm_for_ldiv_by_con( jlong divisor ) {
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1502 // Use hardware integer DIV instruction when
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1503 // it is faster than a code which use multiply.
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1504 // Only when constant divisor fits into 32 bit
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1505 // (min_jint is excluded to get only correct
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1506 // positive 32 bit values from negative).
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1507 return VM_Version::has_fast_idiv() &&
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1508 (divisor == (int)divisor && divisor != min_jint);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1509 }
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1510
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // Register for DIVI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 RegMask Matcher::divI_proj_mask() {
4121
db2e64ca2d5a 7090968: Allow adlc register class to depend on runtime conditions
roland
parents: 4114
diff changeset
1513 return EAX_REG_mask();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // Register for MODI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 RegMask Matcher::modI_proj_mask() {
4121
db2e64ca2d5a 7090968: Allow adlc register class to depend on runtime conditions
roland
parents: 4114
diff changeset
1518 return EDX_REG_mask();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1520
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // Register for DIVL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 RegMask Matcher::divL_proj_mask() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 return RegMask();
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 // Register for MODL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 RegMask Matcher::modL_proj_mask() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 return RegMask();
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
1533 const RegMask Matcher::method_handle_invoke_SP_save_mask() {
4121
db2e64ca2d5a 7090968: Allow adlc register class to depend on runtime conditions
roland
parents: 4114
diff changeset
1534 return EBP_REG_mask();
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
1535 }
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
1536
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1537 const RegMask Matcher::mathExactI_result_proj_mask() {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1538 return EAX_REG_mask();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1539 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1540
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1541 const RegMask Matcher::mathExactL_result_proj_mask() {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1542 ShouldNotReachHere();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1543 return RegMask();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1544 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1545
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1546 const RegMask Matcher::mathExactI_flags_proj_mask() {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1547 return INT_FLAGS_mask();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1548 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
1549
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1550 // Returns true if the high 32 bits of the value is known to be zero.
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1551 bool is_operand_hi32_zero(Node* n) {
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1552 int opc = n->Opcode();
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1553 if (opc == Op_AndL) {
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1554 Node* o2 = n->in(2);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1555 if (o2->is_Con() && (o2->get_long() & 0xFFFFFFFF00000000LL) == 0LL) {
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1556 return true;
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1557 }
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1558 }
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1559 if (opc == Op_ConL && (n->get_long() & 0xFFFFFFFF00000000LL) == 0LL) {
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1560 return true;
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
1561 }
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1562 return false;
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1563 }
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
1564
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1566
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 //----------ENCODING BLOCK-----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // This block specifies the encoding classes used by the compiler to output
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // byte streams. Encoding classes generate functions which are called by
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // Machine Instruction Nodes in order to generate the bit encoding of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 // instruction. Operands specify their base encoding interface with the
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 // interface keyword. There are currently supported four interfaces,
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 // REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 // operand to generate a function which returns its register number when
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 // queried. CONST_INTER causes an operand to generate a function which
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 // returns the value of the constant when queried. MEMORY_INTER causes an
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // operand to generate four functions which return the Base Register, the
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // Index Register, the Scale Value, and the Offset Value of the operand when
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 // queried. COND_INTER causes an operand to generate six functions which
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 // return the encoding code (ie - encoding bits for the instruction)
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 // associated with each basic boolean condition for a conditional instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 // Instructions specify two basic values for encoding. They use the
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 // ins_encode keyword to specify their encoding class (which must be one of
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // the class names specified in the encoding block), and they use the
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 // opcode keyword to specify, in order, their primary, secondary, and
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 // tertiary opcode. Only the opcode sections which a particular instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 // needs for encoding need to be specified.
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 // Build emit functions for each basic byte or larger field in the intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // encoding scheme (opcode, rm, sib, immediate), and call them from C++
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 // code in the enc_class source block. Emit functions will live in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 // main source block for now. In future, we can generalize this by
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 // adding a syntax that specifies the sizes of fields in an order,
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 // so that the adlc can build the emit functions automagically
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1595
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1596 // Emit primary opcode
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1597 enc_class OpcP %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1598 emit_opcode(cbuf, $primary);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1599 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1600
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1601 // Emit secondary opcode
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1602 enc_class OpcS %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1603 emit_opcode(cbuf, $secondary);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1604 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1605
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1606 // Emit opcode directly
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1607 enc_class Opcode(immI d8) %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
1608 emit_opcode(cbuf, $d8$$constant);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 enc_class SizePrefix %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 emit_opcode(cbuf,0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1614
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1615 enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1618
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1619 enc_class OpcRegReg (immI opcode, rRegI dst, rRegI src) %{ // OpcRegReg(Many)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 emit_opcode(cbuf,$opcode$$constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1623
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1624 enc_class mov_r32_imm0( rRegI dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 emit_opcode( cbuf, 0xB8 + $dst$$reg ); // 0xB8+ rd -- MOV r32 ,imm32
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 emit_d32 ( cbuf, 0x0 ); // imm32==0x0
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1628
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 enc_class cdq_enc %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 // Full implementation of Java idiv and irem; checks for
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 // special case as described in JVM spec., p.243 & p.271.
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 // normal case special case
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 // input : rax,: dividend min_int
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 // reg: divisor -1
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // output: rax,: quotient (= rax, idiv reg) min_int
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 // rdx: remainder (= rax, irem reg) 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 // Code sequnce:
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 // 81 F8 00 00 00 80 cmp rax,80000000h
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 // 0F 85 0B 00 00 00 jne normal_case
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // 33 D2 xor rdx,edx
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 // 83 F9 FF cmp rcx,0FFh
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 // 0F 84 03 00 00 00 je done
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 // normal_case:
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 // 99 cdq
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 // F7 F9 idiv rax,ecx
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 // done:
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 emit_opcode(cbuf,0x81); emit_d8(cbuf,0xF8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 emit_opcode(cbuf,0x00); emit_d8(cbuf,0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 emit_opcode(cbuf,0x00); emit_d8(cbuf,0x80); // cmp rax,80000000h
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 emit_opcode(cbuf,0x0F); emit_d8(cbuf,0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 emit_opcode(cbuf,0x0B); emit_d8(cbuf,0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 emit_opcode(cbuf,0x00); emit_d8(cbuf,0x00); // jne normal_case
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 emit_opcode(cbuf,0x33); emit_d8(cbuf,0xD2); // xor rdx,edx
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 emit_opcode(cbuf,0x83); emit_d8(cbuf,0xF9); emit_d8(cbuf,0xFF); // cmp rcx,0FFh
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 emit_opcode(cbuf,0x0F); emit_d8(cbuf,0x84);
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 emit_opcode(cbuf,0x03); emit_d8(cbuf,0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 emit_opcode(cbuf,0x00); emit_d8(cbuf,0x00); // je done
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 // normal_case:
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 emit_opcode(cbuf,0x99); // cdq
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 // idiv (note: must be emitted by the user of this rule)
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 // normal:
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 // Dense encoding for older common ops
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1671 enc_class Opc_plus(immI opcode, rRegI reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 emit_opcode(cbuf, $opcode$$constant + $reg$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 // Opcde enc_class for 8/32 bit immediate instructions with sign-extension
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 enc_class OpcSE (immI imm) %{ // Emit primary opcode and set sign-extend bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 // Check for 8-bit immediate, and set sign extend bit in opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 if (($imm$$constant >= -128) && ($imm$$constant <= 127)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 emit_opcode(cbuf, $primary | 0x02);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 else { // If 32-bit immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 emit_opcode(cbuf, $primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1686
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1687 enc_class OpcSErm (rRegI dst, immI imm) %{ // OpcSEr/m
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // Emit primary opcode and set sign-extend bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // Check for 8-bit immediate, and set sign extend bit in opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 if (($imm$$constant >= -128) && ($imm$$constant <= 127)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 emit_opcode(cbuf, $primary | 0x02); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 else { // If 32-bit immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 emit_opcode(cbuf, $primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 // Emit r/m byte with secondary opcode, after primary opcode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1698
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 enc_class Con8or32 (immI imm) %{ // Con8or32(storeImmI), 8 or 32 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 // Check for 8-bit immediate, and set sign extend bit in opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 if (($imm$$constant >= -128) && ($imm$$constant <= 127)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 $$$emit8$imm$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 else { // If 32-bit immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // Output immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 $$$emit32$imm$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1709
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 enc_class Long_OpcSErm_Lo(eRegL dst, immL imm) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 // Emit primary opcode and set sign-extend bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 // Check for 8-bit immediate, and set sign extend bit in opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 int con = (int)$imm$$constant; // Throw away top bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 emit_opcode(cbuf, ((con >= -128) && (con <= 127)) ? ($primary | 0x02) : $primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // Emit r/m byte with secondary opcode, after primary opcode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 if ((con >= -128) && (con <= 127)) emit_d8 (cbuf,con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 else emit_d32(cbuf,con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1720
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 enc_class Long_OpcSErm_Hi(eRegL dst, immL imm) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 // Emit primary opcode and set sign-extend bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 // Check for 8-bit immediate, and set sign extend bit in opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 int con = (int)($imm$$constant >> 32); // Throw away bottom bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 emit_opcode(cbuf, ((con >= -128) && (con <= 127)) ? ($primary | 0x02) : $primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 // Emit r/m byte with tertiary opcode, after primary opcode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 emit_rm(cbuf, 0x3, $tertiary, HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 if ((con >= -128) && (con <= 127)) emit_d8 (cbuf,con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 else emit_d32(cbuf,con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1731
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1732 enc_class OpcSReg (rRegI dst) %{ // BSWAP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 emit_cc(cbuf, $secondary, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1735
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 enc_class bswap_long_bytes(eRegL dst) %{ // BSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 int destlo = $dst$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 int desthi = HIGH_FROM_LOW(destlo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 // bswap lo
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 emit_opcode(cbuf, 0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 emit_cc(cbuf, 0xC8, destlo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // bswap hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 emit_opcode(cbuf, 0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 emit_cc(cbuf, 0xC8, desthi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 // xchg lo and hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 emit_opcode(cbuf, 0x87);
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 emit_rm(cbuf, 0x3, destlo, desthi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1749
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1750 enc_class RegOpc (rRegI div) %{ // IDIV, IMOD, JMP indirect, ...
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 emit_rm(cbuf, 0x3, $secondary, $div$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1753
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 enc_class enc_cmov(cmpOp cop ) %{ // CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 emit_cc(cbuf, $secondary, $cop$$cmpcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1758
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
1759 enc_class enc_cmov_dpr(cmpOp cop, regDPR src ) %{ // CMOV
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 int op = 0xDA00 + $cop$$cmpcode + ($src$$reg-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 emit_d8(cbuf, op >> 8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 emit_d8(cbuf, op & 255);
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1764
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 // emulate a CMOV with a conditional branch around a MOV
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 enc_class enc_cmov_branch( cmpOp cop, immI brOffs ) %{ // CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 // Invert sense of branch from sense of CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 emit_cc( cbuf, 0x70, ($cop$$cmpcode^1) );
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 emit_d8( cbuf, $brOffs$$constant );
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1771
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 enc_class enc_PartialSubtypeCheck( ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 Register Redi = as_Register(EDI_enc); // result register
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 Register Reax = as_Register(EAX_enc); // super class
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 Register Recx = as_Register(ECX_enc); // killed
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 Register Resi = as_Register(ESI_enc); // sub class
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1777 Label miss;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1778
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 MacroAssembler _masm(&cbuf);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1780 __ check_klass_subtype_slow_path(Resi, Reax, Recx, Redi,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1781 NULL, &miss,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1782 /*set_cond_codes:*/ true);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1783 if ($primary) {
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1784 __ xorptr(Redi, Redi);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
1785 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 __ bind(miss);
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1788
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 enc_class FFree_Float_Stack_All %{ // Free_Float_Stack_All
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 MacroAssembler masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 int start = masm.offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 if (UseSSE >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 if (VerifyFPU) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 masm.verify_FPU(0, "must be empty in SSE2+ mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 // External c_calling_convention expects the FPU stack to be 'clean'.
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 // Compiled code leaves it dirty. Do cleanup now.
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 masm.empty_FPU_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 if (sizeof_FFree_Float_Stack_All == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 sizeof_FFree_Float_Stack_All = masm.offset() - start;
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 assert(masm.offset() - start == sizeof_FFree_Float_Stack_All, "wrong size");
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 enc_class Verify_FPU_For_Leaf %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 if( VerifyFPU ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 MacroAssembler masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 masm.verify_FPU( -3, "Returning from Runtime Leaf call");
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1814
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 enc_class Java_To_Runtime (method meth) %{ // CALL Java_To_Runtime, Java_To_Runtime_Leaf
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // This is the instruction starting address for relocation info.
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1817 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // CALL directly to the runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1820 emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 runtime_call_Relocation::spec(), RELOC_IMM32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1822
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 if (UseSSE >= 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 MacroAssembler _masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 BasicType rt = tf()->return_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1826
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 if ((rt == T_FLOAT || rt == T_DOUBLE) && !return_value_is_used()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 // A C runtime call where the return value is unused. In SSE2+
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 // mode the result needs to be removed from the FPU stack. It's
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 // likely that this function call could be removed by the
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 // optimizer if the C function is a pure function.
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 __ ffree(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 } else if (rt == T_FLOAT) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
1834 __ lea(rsp, Address(rsp, -4));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 __ fstp_s(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 __ movflt(xmm0, Address(rsp, 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
1837 __ lea(rsp, Address(rsp, 4));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 } else if (rt == T_DOUBLE) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
1839 __ lea(rsp, Address(rsp, -8));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 __ fstp_d(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 __ movdbl(xmm0, Address(rsp, 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
1842 __ lea(rsp, Address(rsp, 8));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
a61af66fc99e Initial load
duke
parents:
diff changeset
1847
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1848 enc_class pre_call_resets %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 // If method sets FPU control word restore it here
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1850 debug_only(int off0 = cbuf.insts_size());
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1851 if (ra_->C->in_24_bit_fp_mode()) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1852 MacroAssembler _masm(&cbuf);
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1853 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1854 }
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1855 if (ra_->C->max_vector_size() > 16) {
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1856 // Clear upper bits of YMM registers when current compiled code uses
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1857 // wide vectors to avoid AVX <-> SSE transition penalty during call.
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1858 MacroAssembler _masm(&cbuf);
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1859 __ vzeroupper();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1861 debug_only(int off1 = cbuf.insts_size());
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1862 assert(off1 - off0 == pre_call_resets_size(), "correct size prediction");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1864
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 enc_class post_call_FPU %{
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 // If method sets FPU control word do it here also
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1867 if (Compile::current()->in_24_bit_fp_mode()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 MacroAssembler masm(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 masm.fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1872
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 enc_class Java_Static_Call (method meth) %{ // JAVA STATIC CALL
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 // CALL to fixup routine. Fixup routine uses ScopeDesc info to determine
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 // who we intended to call.
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1876 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 $$$emit8$primary;
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1878 if (!_method) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1879 emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 runtime_call_Relocation::spec(), RELOC_IMM32 );
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
1881 } else if (_optimized_virtual) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1882 emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 opt_virtual_call_Relocation::spec(), RELOC_IMM32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 } else {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1885 emit_d32_reloc(cbuf, ($meth$$method - (int)(cbuf.insts_end()) - 4),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 static_call_Relocation::spec(), RELOC_IMM32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 }
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents: 8873
diff changeset
1888 if (_method) { // Emit stub for static call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents: 8873
diff changeset
1889 CompiledStaticCall::emit_to_interp_stub(cbuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1892
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 enc_class Java_Dynamic_Call (method meth) %{ // JAVA DYNAMIC CALL
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
1894 MacroAssembler _masm(&cbuf);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
1895 __ ic_call((address)$meth$$method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1897
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 enc_class Java_Compiled_Call (method meth) %{ // JAVA COMPILED CALL
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
1899 int disp = in_bytes(Method::from_compiled_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 assert( -128 <= disp && disp <= 127, "compiled_code_offset isn't small");
a61af66fc99e Initial load
duke
parents:
diff changeset
1901
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
1902 // CALL *[EAX+in_bytes(Method::from_compiled_code_entry_point_offset())]
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1903 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 emit_rm(cbuf, 0x01, $secondary, EAX_enc ); // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 emit_d8(cbuf, disp); // Displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
1907
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1909
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // Following encoding is no longer used, but may be restored if calling
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // convention changes significantly.
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 // Became: Xor_Reg(EBP), Java_To_Runtime( labl )
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 // enc_class Java_Interpreter_Call (label labl) %{ // JAVA INTERPRETER CALL
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 // // int ic_reg = Matcher::inline_cache_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // // int ic_encode = Matcher::_regEncode[ic_reg];
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 // // int imo_reg = Matcher::interpreter_method_oop_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 // // int imo_encode = Matcher::_regEncode[imo_reg];
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 // // // Interpreter expects method_oop in EBX, currently a callee-saved register,
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // // // so we load it immediately before the call
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 // // emit_opcode(cbuf, 0x8B); // MOV imo_reg,ic_reg # method_oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 // // emit_rm(cbuf, 0x03, imo_encode, ic_encode ); // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 // // xor rbp,ebp
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 // emit_opcode(cbuf, 0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 // emit_rm(cbuf, 0x3, EBP_enc, EBP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 // // CALL to interpreter.
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1930 // cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 // $$$emit8$primary;
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
1932 // emit_d32_reloc(cbuf, ($labl$$label - (int)(cbuf.insts_end()) - 4),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // runtime_call_Relocation::spec(), RELOC_IMM32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1935
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1936 enc_class RegOpcImm (rRegI dst, immI8 shift) %{ // SHL, SAR, SHR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 $$$emit8$shift$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1941
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1942 enc_class LdImmI (rRegI dst, immI src) %{ // Load Immediate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 // Load immediate does not have a zero or sign extended version
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 // for 8-bit immediates
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 emit_opcode(cbuf, 0xB8 + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 $$$emit32$src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1948
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1949 enc_class LdImmP (rRegI dst, immI src) %{ // Load Immediate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 // Load immediate does not have a zero or sign extended version
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // for 8-bit immediates
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 emit_opcode(cbuf, $primary + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 $$$emit32$src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1955
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 enc_class LdImmL_Lo( eRegL dst, immL src) %{ // Load Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 // Load immediate does not have a zero or sign extended version
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // for 8-bit immediates
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 int dst_enc = $dst$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 int src_con = $src$$constant & 0x0FFFFFFFFL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 if (src_con == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 // xor dst, dst
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 emit_opcode(cbuf, 0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 emit_rm(cbuf, 0x3, dst_enc, dst_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 emit_opcode(cbuf, $primary + dst_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 emit_d32(cbuf, src_con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 enc_class LdImmL_Hi( eRegL dst, immL src) %{ // Load Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 // Load immediate does not have a zero or sign extended version
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 // for 8-bit immediates
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 int dst_enc = $dst$$reg + 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 int src_con = ((julong)($src$$constant)) >> 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 if (src_con == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 // xor dst, dst
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 emit_opcode(cbuf, 0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 emit_rm(cbuf, 0x3, dst_enc, dst_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 emit_opcode(cbuf, $primary + dst_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 emit_d32(cbuf, src_con);
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1985
a61af66fc99e Initial load
duke
parents:
diff changeset
1986
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // Encode a reg-reg copy. If it is useless, then empty encoding.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1988 enc_class enc_Copy( rRegI dst, rRegI src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 encode_Copy( cbuf, $dst$$reg, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1991
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1992 enc_class enc_CopyL_Lo( rRegI dst, eRegL src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 encode_Copy( cbuf, $dst$$reg, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1995
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
1996 enc_class RegReg (rRegI dst, rRegI src) %{ // RegReg(Many)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
1999
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 enc_class RegReg_Lo(eRegL dst, eRegL src) %{ // RegReg(Many)
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 enc_class RegReg_Hi(eRegL dst, eRegL src) %{ // RegReg(Many)
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 $$$emit8$secondary;
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2009
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 enc_class RegReg_Lo2(eRegL dst, eRegL src) %{ // RegReg(Many)
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2013
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 enc_class RegReg_Hi2(eRegL dst, eRegL src) %{ // RegReg(Many)
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2017
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2018 enc_class RegReg_HiLo( eRegL src, rRegI dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 enc_class Con32 (immI src) %{ // Con32(storeImmI)
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 // Output immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 $$$emit32$src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2027 enc_class Con32FPR_as_bits(immFPR src) %{ // storeF_imm
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 // Output Float immediate bits
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 jfloat jf = $src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 int jf_as_bits = jint_cast( jf );
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 emit_d32(cbuf, jf_as_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2033
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2034 enc_class Con32F_as_bits(immF src) %{ // storeX_imm
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 // Output Float immediate bits
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 jfloat jf = $src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 int jf_as_bits = jint_cast( jf );
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 emit_d32(cbuf, jf_as_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 enc_class Con16 (immI src) %{ // Con16(storeImmI)
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // Output immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 $$$emit16$src$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2045
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 enc_class Con_d32(immI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 emit_d32(cbuf,$src$$constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2049
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 enc_class conmemref (eRegP t1) %{ // Con32(storeImmI)
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 // Output immediate memory reference
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 emit_rm(cbuf, 0x00, $t1$$reg, 0x05 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 emit_d32(cbuf, 0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2055
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 enc_class lock_prefix( ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 if( os::is_MP() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 emit_opcode(cbuf,0xF0); // [Lock]
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2060
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 // Cmp-xchg long value.
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // Note: we need to swap rbx, and rcx before and after the
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // cmpxchg8 instruction because the instruction uses
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // rcx as the high order word of the new value to store but
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // our register encoding uses rbx,.
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 enc_class enc_cmpxchg8(eSIRegP mem_ptr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2067
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // XCHG rbx,ecx
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 emit_opcode(cbuf,0x87);
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 emit_opcode(cbuf,0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 // [Lock]
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 if( os::is_MP() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 emit_opcode(cbuf,0xF0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // CMPXCHG8 [Eptr]
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 emit_opcode(cbuf,0xC7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 emit_rm( cbuf, 0x0, 1, $mem_ptr$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // XCHG rbx,ecx
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 emit_opcode(cbuf,0x87);
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 emit_opcode(cbuf,0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2082
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 enc_class enc_cmpxchg(eSIRegP mem_ptr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 // [Lock]
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 if( os::is_MP() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 emit_opcode(cbuf,0xF0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2087
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 // CMPXCHG [Eptr]
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 emit_opcode(cbuf,0xB1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 emit_rm( cbuf, 0x0, 1, $mem_ptr$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2093
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 enc_class enc_flags_ne_to_boolean( iRegI res ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 int res_encoding = $res$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2096
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // MOV res,0
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 emit_opcode( cbuf, 0xB8 + res_encoding);
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 emit_d32( cbuf, 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 // JNE,s fail
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 emit_opcode(cbuf,0x75);
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 emit_d8(cbuf, 5 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 // MOV res,1
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 emit_opcode( cbuf, 0xB8 + res_encoding);
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 emit_d32( cbuf, 1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 // fail:
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2108
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 enc_class set_instruction_start( ) %{
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2110 cbuf.set_insts_mark(); // Mark start of opcode for reloc info in mem operand
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2112
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2113 enc_class RegMem (rRegI ereg, memory mem) %{ // emit_reg_mem
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 int reg_encoding = $ereg$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2119 relocInfo::relocType disp_reloc = $mem->disp_reloc();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2120 encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2122
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 enc_class RegMem_Hi(eRegL ereg, memory mem) %{ // emit_reg_mem
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 int reg_encoding = HIGH_FROM_LOW($ereg$$reg); // Hi register of pair, computed from lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 int displace = $mem$$disp + 4; // Offset is 4 further in memory
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2129 assert( $mem->disp_reloc() == relocInfo::none, "Cannot add 4 to oop" );
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2130 encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, relocInfo::none);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2132
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 enc_class move_long_small_shift( eRegL dst, immI_1_31 cnt ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 int r1, r2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 if( $tertiary == 0xA4 ) { r1 = $dst$$reg; r2 = HIGH_FROM_LOW($dst$$reg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 else { r2 = $dst$$reg; r1 = HIGH_FROM_LOW($dst$$reg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 emit_opcode(cbuf,$tertiary);
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 emit_rm(cbuf, 0x3, r1, r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 emit_d8(cbuf,$cnt$$constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 emit_d8(cbuf,$primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 emit_rm(cbuf, 0x3, $secondary, r1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 emit_d8(cbuf,$cnt$$constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2145
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 enc_class move_long_big_shift_sign( eRegL dst, immI_32_63 cnt ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 emit_opcode( cbuf, 0x8B ); // Move
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($dst$$reg));
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
2149 if( $cnt$$constant > 32 ) { // Shift, if not by zero
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
2150 emit_d8(cbuf,$primary);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
2151 emit_rm(cbuf, 0x3, $secondary, $dst$$reg);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
2152 emit_d8(cbuf,$cnt$$constant-32);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
2153 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 emit_d8(cbuf,$primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 emit_rm(cbuf, 0x3, $secondary, HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 emit_d8(cbuf,31);
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2158
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 enc_class move_long_big_shift_clr( eRegL dst, immI_32_63 cnt ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 int r1, r2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 if( $secondary == 0x5 ) { r1 = $dst$$reg; r2 = HIGH_FROM_LOW($dst$$reg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 else { r2 = $dst$$reg; r1 = HIGH_FROM_LOW($dst$$reg); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 emit_opcode( cbuf, 0x8B ); // Move r1,r2
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 emit_rm(cbuf, 0x3, r1, r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 if( $cnt$$constant > 32 ) { // Shift, if not by zero
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 emit_opcode(cbuf,$primary);
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 emit_rm(cbuf, 0x3, $secondary, r1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 emit_d8(cbuf,$cnt$$constant-32);
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 emit_opcode(cbuf,0x33); // XOR r2,r2
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 emit_rm(cbuf, 0x3, r2, r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2174
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 // Clone of RegMem but accepts an extra parameter to access each
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 // half of a double in memory; it never needs relocation info.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2177 enc_class Mov_MemD_half_to_Reg (immI opcode, memory mem, immI disp_for_half, rRegI rm_reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 emit_opcode(cbuf,$opcode$$constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 int reg_encoding = $rm_reg$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 int displace = $mem$$disp + $disp_for_half$$constant;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2184 relocInfo::relocType disp_reloc = relocInfo::none;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2185 encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2187
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 // !!!!! Special Custom Code used by MemMove, and stack access instructions !!!!!
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 // Clone of RegMem except the RM-byte's reg/opcode field is an ADLC-time constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 // and it never needs relocation information.
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 // Frequently used to move data between FPU's Stack Top and memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 enc_class RMopc_Mem_no_oop (immI rm_opcode, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 int rm_byte_opcode = $rm_opcode$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2199 assert( $mem->disp_reloc() == relocInfo::none, "No oops here because no reloc info allowed" );
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2200 encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, relocInfo::none);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2202
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 enc_class RMopc_Mem (immI rm_opcode, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 int rm_byte_opcode = $rm_opcode$$constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2209 relocInfo::relocType disp_reloc = $mem->disp_reloc(); // disp-as-oop when working with static globals
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2210 encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2212
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2213 enc_class RegLea (rRegI dst, rRegI src0, immI src1 ) %{ // emit_reg_lea
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 int reg_encoding = $dst$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 int base = $src0$$reg; // 0xFFFFFFFF indicates no base
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 int index = 0x04; // 0x04 indicates no index
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 int scale = 0x00; // 0x00 indicates no scale
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 int displace = $src1$$constant; // 0x00 indicates no displacement
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2219 relocInfo::relocType disp_reloc = relocInfo::none;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2220 encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2222
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2223 enc_class min_enc (rRegI dst, rRegI src) %{ // MIN
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 // Compare dst,src
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 emit_opcode(cbuf,0x3B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 // jmp dst < src around move
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 emit_opcode(cbuf,0x7C);
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 emit_d8(cbuf,2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 // move dst,src
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 emit_opcode(cbuf,0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2234
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2235 enc_class max_enc (rRegI dst, rRegI src) %{ // MAX
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 // Compare dst,src
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 emit_opcode(cbuf,0x3B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 // jmp dst > src around move
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 emit_opcode(cbuf,0x7F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 emit_d8(cbuf,2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 // move dst,src
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 emit_opcode(cbuf,0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 emit_rm(cbuf, 0x3, $dst$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2246
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2247 enc_class enc_FPR_store(memory mem, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 // If src is FPR1, we can just FST to store it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // Else we need to FLD it to FPR1, then FSTP to store/pop it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 int reg_encoding = 0x2; // Just store
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2255 relocInfo::relocType disp_reloc = $mem->disp_reloc(); // disp-as-oop when working with static globals
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 if( $src$$reg != FPR1L_enc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 reg_encoding = 0x3; // Store & pop
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 emit_opcode( cbuf, 0xD9 ); // FLD (i.e., push it)
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 emit_d8( cbuf, 0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2261 cbuf.set_insts_mark(); // Mark start of opcode for reloc info in mem operand
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 emit_opcode(cbuf,$primary);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
2263 encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2265
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2266 enc_class neg_reg(rRegI dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 // NEG $dst
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 emit_opcode(cbuf,0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 emit_rm(cbuf, 0x3, 0x03, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2271
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 enc_class setLT_reg(eCXRegI dst) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 // SETLT $dst
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 emit_opcode(cbuf,0x9C);
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 emit_rm( cbuf, 0x3, 0x4, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 enc_class enc_cmpLTP(ncxRegI p, ncxRegI q, ncxRegI y, eCXRegI tmp) %{ // cadd_cmpLT
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 int tmpReg = $tmp$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2281
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 // SUB $p,$q
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 emit_opcode(cbuf,0x2B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 emit_rm(cbuf, 0x3, $p$$reg, $q$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 // SBB $tmp,$tmp
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 emit_opcode(cbuf,0x1B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 emit_rm(cbuf, 0x3, tmpReg, tmpReg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 // AND $tmp,$y
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 emit_opcode(cbuf,0x23);
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 emit_rm(cbuf, 0x3, tmpReg, $y$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 // ADD $p,$tmp
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 emit_opcode(cbuf,0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2295
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 enc_class shift_left_long( eRegL dst, eCXRegI shift ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 // TEST shift,32
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 emit_opcode(cbuf,0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 emit_rm(cbuf, 0x3, 0, ECX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 emit_d32(cbuf,0x20);
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 // JEQ,s small
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 emit_opcode(cbuf, 0x74);
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 emit_d8(cbuf, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 // MOV $dst.hi,$dst.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 emit_opcode( cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 // CLR $dst.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 emit_opcode(cbuf, 0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 emit_rm(cbuf, 0x3, $dst$$reg, $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 // small:
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 // SHLD $dst.hi,$dst.lo,$shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 emit_opcode(cbuf,0xA5);
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 // SHL $dst.lo,$shift"
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 emit_opcode(cbuf,0xD3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 emit_rm(cbuf, 0x3, 0x4, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2319
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 enc_class shift_right_long( eRegL dst, eCXRegI shift ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 // TEST shift,32
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 emit_opcode(cbuf,0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 emit_rm(cbuf, 0x3, 0, ECX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 emit_d32(cbuf,0x20);
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 // JEQ,s small
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 emit_opcode(cbuf, 0x74);
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 emit_d8(cbuf, 0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 // MOV $dst.lo,$dst.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 emit_opcode( cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 // CLR $dst.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 emit_opcode(cbuf, 0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 // small:
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 // SHRD $dst.lo,$dst.hi,$shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 emit_opcode(cbuf,0xAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 // SHR $dst.hi,$shift"
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 emit_opcode(cbuf,0xD3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 emit_rm(cbuf, 0x3, 0x5, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2343
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 enc_class shift_right_arith_long( eRegL dst, eCXRegI shift ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 // TEST shift,32
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 emit_opcode(cbuf,0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 emit_rm(cbuf, 0x3, 0, ECX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 emit_d32(cbuf,0x20);
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 // JEQ,s small
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 emit_opcode(cbuf, 0x74);
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 emit_d8(cbuf, 0x05);
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 // MOV $dst.lo,$dst.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 emit_opcode( cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 emit_rm(cbuf, 0x3, $dst$$reg, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 // SAR $dst.hi,31
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 emit_opcode(cbuf, 0xC1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 emit_rm(cbuf, 0x3, 7, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 emit_d8(cbuf, 0x1F );
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 // small:
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 // SHRD $dst.lo,$dst.hi,$shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 emit_opcode(cbuf,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 emit_opcode(cbuf,0xAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 // SAR $dst.hi,$shift"
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 emit_opcode(cbuf,0xD3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 emit_rm(cbuf, 0x3, 0x7, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2368
a61af66fc99e Initial load
duke
parents:
diff changeset
2369
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 // ----------------- Encodings for floating point unit -----------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 // May leave result in FPU-TOS or FPU reg depending on opcodes
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2372 enc_class OpcReg_FPR(regFPR src) %{ // FMUL, FDIV
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 $$$emit8$primary;
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 emit_rm(cbuf, 0x3, $secondary, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2376
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 // Pop argument in FPR0 with FSTP ST(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 enc_class PopFPU() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 emit_opcode( cbuf, 0xDD );
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 emit_d8( cbuf, 0xD8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2382
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 // !!!!! equivalent to Pop_Reg_F
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2384 enc_class Pop_Reg_DPR( regDPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 emit_opcode( cbuf, 0xDD ); // FSTP ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 emit_d8( cbuf, 0xD8+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2388
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2389 enc_class Push_Reg_DPR( regDPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 emit_opcode( cbuf, 0xD9 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 emit_d8( cbuf, 0xC0-1+$dst$$reg ); // FLD ST(i-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2393
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2394 enc_class strictfp_bias1( regDPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 emit_opcode( cbuf, 0xDB ); // FLD m80real
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 emit_opcode( cbuf, 0x2D );
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 emit_d32( cbuf, (int)StubRoutines::addr_fpu_subnormal_bias1() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 emit_opcode( cbuf, 0xDE ); // FMULP ST(dst), ST0
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 emit_opcode( cbuf, 0xC8+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2401
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2402 enc_class strictfp_bias2( regDPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 emit_opcode( cbuf, 0xDB ); // FLD m80real
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 emit_opcode( cbuf, 0x2D );
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 emit_d32( cbuf, (int)StubRoutines::addr_fpu_subnormal_bias2() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 emit_opcode( cbuf, 0xDE ); // FMULP ST(dst), ST0
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 emit_opcode( cbuf, 0xC8+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 // Special case for moving an integer register to a stack slot.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2411 enc_class OpcPRegSS( stackSlotI dst, rRegI src ) %{ // RegSS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 store_to_stackslot( cbuf, $primary, $src$$reg, $dst$$disp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2414
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 // Special case for moving a register to a stack slot.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2416 enc_class RegSS( stackSlotI dst, rRegI src ) %{ // RegSS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 // Opcode already emitted
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 emit_rm( cbuf, 0x02, $src$$reg, ESP_enc ); // R/M byte
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 emit_rm( cbuf, 0x00, ESP_enc, ESP_enc); // SIB byte
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 emit_d32(cbuf, $dst$$disp); // Displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2422
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 // Push the integer in stackSlot 'src' onto FP-stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 enc_class Push_Mem_I( memory src ) %{ // FILD [ESP+src]
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 store_to_stackslot( cbuf, $primary, $secondary, $src$$disp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 // Push FPU's TOS float to a stack-slot, and pop FPU-stack
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2429 enc_class Pop_Mem_FPR( stackSlotF dst ) %{ // FSTP_S [ESP+dst]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 store_to_stackslot( cbuf, 0xD9, 0x03, $dst$$disp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2432
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 // Same as Pop_Mem_F except for opcode
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 // Push FPU's TOS double to a stack-slot, and pop FPU-stack
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2435 enc_class Pop_Mem_DPR( stackSlotD dst ) %{ // FSTP_D [ESP+dst]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 store_to_stackslot( cbuf, 0xDD, 0x03, $dst$$disp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2438
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2439 enc_class Pop_Reg_FPR( regFPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 emit_opcode( cbuf, 0xDD ); // FSTP ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 emit_d8( cbuf, 0xD8+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2443
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2444 enc_class Push_Reg_FPR( regFPR dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 emit_opcode( cbuf, 0xD9 ); // FLD ST(i-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 emit_d8( cbuf, 0xC0-1+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2448
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 // Push FPU's float to a stack-slot, and pop FPU-stack
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2450 enc_class Pop_Mem_Reg_FPR( stackSlotF dst, regFPR src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 int pop = 0x02;
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 if ($src$$reg != FPR1L_enc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 emit_opcode( cbuf, 0xD9 ); // FLD ST(i-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 emit_d8( cbuf, 0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 pop = 0x03;
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 store_to_stackslot( cbuf, 0xD9, pop, $dst$$disp ); // FST<P>_S [ESP+dst]
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2459
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 // Push FPU's double to a stack-slot, and pop FPU-stack
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2461 enc_class Pop_Mem_Reg_DPR( stackSlotD dst, regDPR src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 int pop = 0x02;
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 if ($src$$reg != FPR1L_enc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 emit_opcode( cbuf, 0xD9 ); // FLD ST(i-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 emit_d8( cbuf, 0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 pop = 0x03;
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 store_to_stackslot( cbuf, 0xDD, pop, $dst$$disp ); // FST<P>_D [ESP+dst]
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2470
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 // Push FPU's double to a FPU-stack-slot, and pop FPU-stack
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2472 enc_class Pop_Reg_Reg_DPR( regDPR dst, regFPR src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 int pop = 0xD0 - 1; // -1 since we skip FLD
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 if ($src$$reg != FPR1L_enc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 emit_opcode( cbuf, 0xD9 ); // FLD ST(src-1)
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 emit_d8( cbuf, 0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 pop = 0xD8;
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 emit_opcode( cbuf, 0xDD );
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 emit_d8( cbuf, pop+$dst$$reg ); // FST<P> ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2482
a61af66fc99e Initial load
duke
parents:
diff changeset
2483
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2484 enc_class Push_Reg_Mod_DPR( regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 // load dst in FPR0
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 emit_opcode( cbuf, 0xD9 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 emit_d8( cbuf, 0xC0-1+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 if ($src$$reg != FPR1L_enc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 // fincstp
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 emit_opcode (cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 emit_opcode (cbuf, 0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // swap src with FPR1:
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 // FXCH FPR1 with src
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 emit_opcode(cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 emit_d8(cbuf, 0xC8-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 // fdecstp
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 emit_opcode (cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 emit_opcode (cbuf, 0xF6);
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2501
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2502 enc_class Push_ModD_encoding(regD src0, regD src1) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2503 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2504 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2505 __ movdbl(Address(rsp, 0), $src1$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2506 __ fld_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2507 __ movdbl(Address(rsp, 0), $src0$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2508 __ fld_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2509 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2510
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2511 enc_class Push_ModF_encoding(regF src0, regF src1) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2512 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2513 __ subptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2514 __ movflt(Address(rsp, 0), $src1$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2515 __ fld_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2516 __ movflt(Address(rsp, 0), $src0$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2517 __ fld_s(Address(rsp, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2519
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2520 enc_class Push_ResultD(regD dst) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2521 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2522 __ fstp_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2523 __ movdbl($dst$$XMMRegister, Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2524 __ addptr(rsp, 8);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2526
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2527 enc_class Push_ResultF(regF dst, immI d8) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2528 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2529 __ fstp_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2530 __ movflt($dst$$XMMRegister, Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2531 __ addptr(rsp, $d8$$constant);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2533
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2534 enc_class Push_SrcD(regD src) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2535 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2536 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2537 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2538 __ fld_d(Address(rsp, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 enc_class push_stack_temp_qword() %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2542 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2543 __ subptr(rsp, 8);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2545
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 enc_class pop_stack_temp_qword() %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2547 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2548 __ addptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2549 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2550
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2551 enc_class push_xmm_to_fpr1(regD src) %{
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2552 MacroAssembler _masm(&cbuf);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2553 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
2554 __ fld_d(Address(rsp, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2556
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2557 enc_class Push_Result_Mod_DPR( regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 if ($src$$reg != FPR1L_enc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 // fincstp
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 emit_opcode (cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 emit_opcode (cbuf, 0xF7);
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 // FXCH FPR1 with src
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 emit_opcode(cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 emit_d8(cbuf, 0xC8-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 // fdecstp
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 emit_opcode (cbuf, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 emit_opcode (cbuf, 0xF6);
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 // // following asm replaced with Pop_Reg_F or Pop_Mem_F
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 // // FSTP FPR$dst$$reg
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 // emit_opcode( cbuf, 0xDD );
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 // emit_d8( cbuf, 0xD8+$dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2574
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 enc_class fnstsw_sahf_skip_parity() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 // fnstsw ax
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 emit_opcode( cbuf, 0xDF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 emit_opcode( cbuf, 0xE0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 // sahf
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 emit_opcode( cbuf, 0x9E );
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 // jnp ::skip
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 emit_opcode( cbuf, 0x7B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 emit_opcode( cbuf, 0x05 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
2586 enc_class emitModDPR() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 // fprem must be iterative
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 // :: loop
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 // fprem
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 emit_opcode( cbuf, 0xD9 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 emit_opcode( cbuf, 0xF8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 // wait
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 emit_opcode( cbuf, 0x9b );
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 // fnstsw ax
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 emit_opcode( cbuf, 0xDF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 emit_opcode( cbuf, 0xE0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 // sahf
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 emit_opcode( cbuf, 0x9E );
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 // jp ::loop
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 emit_opcode( cbuf, 0x0F );
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 emit_opcode( cbuf, 0x8A );
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 emit_opcode( cbuf, 0xF4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 emit_opcode( cbuf, 0xFF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 emit_opcode( cbuf, 0xFF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 emit_opcode( cbuf, 0xFF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2607
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 enc_class fpu_flags() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 // fnstsw_ax
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 emit_opcode( cbuf, 0xDF);
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 emit_opcode( cbuf, 0xE0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 // test ax,0x0400
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 emit_opcode( cbuf, 0x66 ); // operand-size prefix for 16-bit immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 emit_opcode( cbuf, 0xA9 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 emit_d16 ( cbuf, 0x0400 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 // // // This sequence works, but stalls for 12-16 cycles on PPro
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 // // test rax,0x0400
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 // emit_opcode( cbuf, 0xA9 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 // emit_d32 ( cbuf, 0x00000400 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 // jz exit (no unordered comparison)
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 emit_opcode( cbuf, 0x74 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 emit_d8 ( cbuf, 0x02 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 // mov ah,1 - treat as LT case (set carry flag)
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 emit_opcode( cbuf, 0xB4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 emit_d8 ( cbuf, 0x01 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 // sahf
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 emit_opcode( cbuf, 0x9E);
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2630
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 enc_class cmpF_P6_fixup() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 // Fixup the integer flags in case comparison involved a NaN
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 // JNP exit (no unordered comparison, P-flag is set by NaN)
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 emit_opcode( cbuf, 0x7B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 emit_d8 ( cbuf, 0x03 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 // MOV AH,1 - treat as LT case (set carry flag)
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 emit_opcode( cbuf, 0xB4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 emit_d8 ( cbuf, 0x01 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 // SAHF
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 emit_opcode( cbuf, 0x9E);
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 // NOP // target for branch to avoid branch to branch
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 emit_opcode( cbuf, 0x90);
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2645
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 // fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 // sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 // movl(dst, nan_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 // jcc(Assembler::parity, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 // movl(dst, less_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // jcc(Assembler::below, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 // movl(dst, equal_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 // jcc(Assembler::equal, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 // movl(dst, greater_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2655
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 // less_result = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 // greater_result = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 // equal_result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 // nan_result = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2660
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2661 enc_class CmpF_Result(rRegI dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 // fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 emit_opcode( cbuf, 0xDF);
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 emit_opcode( cbuf, 0xE0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 // sahf
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 emit_opcode( cbuf, 0x9E);
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 // movl(dst, nan_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 emit_opcode( cbuf, 0xB8 + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 emit_d32( cbuf, -1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 // jcc(Assembler::parity, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 emit_opcode( cbuf, 0x7A );
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 emit_d8 ( cbuf, 0x13 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 // movl(dst, less_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 emit_opcode( cbuf, 0xB8 + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 emit_d32( cbuf, -1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 // jcc(Assembler::below, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 emit_opcode( cbuf, 0x72 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 emit_d8 ( cbuf, 0x0C );
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 // movl(dst, equal_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 emit_opcode( cbuf, 0xB8 + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 emit_d32( cbuf, 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 // jcc(Assembler::equal, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 emit_opcode( cbuf, 0x74 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 emit_d8 ( cbuf, 0x05 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 // movl(dst, greater_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 emit_opcode( cbuf, 0xB8 + $dst$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 emit_d32( cbuf, 1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2689
a61af66fc99e Initial load
duke
parents:
diff changeset
2690
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 // Compare the longs and set flags
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 // BROKEN! Do Not use as-is
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 enc_class cmpl_test( eRegL src1, eRegL src2 ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 // CMP $src1.hi,$src2.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($src1$$reg), HIGH_FROM_LOW($src2$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 // JNE,s done
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 emit_opcode(cbuf,0x75);
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 emit_d8(cbuf, 2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 // CMP $src1.lo,$src2.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 emit_rm(cbuf, 0x3, $src1$$reg, $src2$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 // done:
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2705
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2706 enc_class convert_int_long( regL dst, rRegI src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 // mov $dst.lo,$src
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 int dst_encoding = $dst$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 int src_encoding = $src$$reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 encode_Copy( cbuf, dst_encoding , src_encoding );
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 // mov $dst.hi,$src
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 encode_Copy( cbuf, HIGH_FROM_LOW(dst_encoding), src_encoding );
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 // sar $dst.hi,31
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 emit_opcode( cbuf, 0xC1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 emit_rm(cbuf, 0x3, 7, HIGH_FROM_LOW(dst_encoding) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 emit_d8(cbuf, 0x1F );
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2718
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 enc_class convert_long_double( eRegL src ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 // push $src.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 emit_opcode(cbuf, 0x50+HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 // push $src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 emit_opcode(cbuf, 0x50+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 // fild 64-bits at [SP]
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 emit_opcode(cbuf,0xdf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 emit_d8(cbuf, 0x6C);
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 emit_d8(cbuf, 0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 emit_d8(cbuf, 0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 // pop stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 emit_opcode(cbuf, 0x83); // add SP, #8
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 emit_rm(cbuf, 0x3, 0x00, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 emit_d8(cbuf, 0x8);
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2734
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 enc_class multiply_con_and_shift_high( eDXRegI dst, nadxRegI src1, eADXRegL_low_only src2, immI_32_63 cnt, eFlagsReg cr ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 // IMUL EDX:EAX,$src1
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 emit_opcode( cbuf, 0xF7 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 emit_rm( cbuf, 0x3, 0x5, $src1$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 // SAR EDX,$cnt-32
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 int shift_count = ((int)$cnt$$constant) - 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 if (shift_count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 emit_opcode(cbuf, 0xC1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 emit_rm(cbuf, 0x3, 7, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 emit_d8(cbuf, shift_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2747
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 // this version doesn't have add sp, 8
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 enc_class convert_long_double2( eRegL src ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 // push $src.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 emit_opcode(cbuf, 0x50+HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 // push $src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 emit_opcode(cbuf, 0x50+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 // fild 64-bits at [SP]
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 emit_opcode(cbuf,0xdf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 emit_d8(cbuf, 0x6C);
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 emit_d8(cbuf, 0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 emit_d8(cbuf, 0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2760
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 enc_class long_int_multiply( eADXRegL dst, nadxRegI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 // Basic idea: long = (long)int * (long)int
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 // IMUL EDX:EAX, src
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 emit_opcode( cbuf, 0xF7 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 emit_rm( cbuf, 0x3, 0x5, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2767
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 enc_class long_uint_multiply( eADXRegL dst, nadxRegI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 // Basic Idea: long = (int & 0xffffffffL) * (int & 0xffffffffL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 // MUL EDX:EAX, src
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 emit_opcode( cbuf, 0xF7 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 emit_rm( cbuf, 0x3, 0x4, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2774
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2775 enc_class long_multiply( eADXRegL dst, eRegL src, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 // Basic idea: lo(result) = lo(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 // MOV $tmp,$src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 encode_Copy( cbuf, $tmp$$reg, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 // IMUL $tmp,EDX
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 emit_opcode( cbuf, 0x0F );
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 emit_opcode( cbuf, 0xAF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 emit_rm( cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 // MOV EDX,$src.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 encode_Copy( cbuf, HIGH_FROM_LOW($dst$$reg), HIGH_FROM_LOW($src$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 // IMUL EDX,EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 emit_opcode( cbuf, 0x0F );
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 emit_opcode( cbuf, 0xAF );
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 emit_rm( cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 // ADD $tmp,EDX
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 emit_opcode( cbuf, 0x03 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 emit_rm( cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 // MUL EDX:EAX,$src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 emit_opcode( cbuf, 0xF7 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 emit_rm( cbuf, 0x3, 0x4, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 // ADD EDX,ESI
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 emit_opcode( cbuf, 0x03 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 emit_rm( cbuf, 0x3, HIGH_FROM_LOW($dst$$reg), $tmp$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2800
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2801 enc_class long_multiply_con( eADXRegL dst, immL_127 src, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 // Basic idea: lo(result) = lo(src * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 // hi(result) = hi(src * y_lo) + lo(src * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 // IMUL $tmp,EDX,$src
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 emit_opcode( cbuf, 0x6B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 emit_rm( cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($dst$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 emit_d8( cbuf, (int)$src$$constant );
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 // MOV EDX,$src
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 emit_opcode(cbuf, 0xB8 + EDX_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 emit_d32( cbuf, (int)$src$$constant );
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 // MUL EDX:EAX,EDX
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 emit_opcode( cbuf, 0xF7 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 emit_rm( cbuf, 0x3, 0x4, EDX_enc );
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 // ADD EDX,ESI
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 emit_opcode( cbuf, 0x03 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 emit_rm( cbuf, 0x3, EDX_enc, $tmp$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2818
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 enc_class long_div( eRegL src1, eRegL src2 ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 // PUSH src1.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 emit_opcode(cbuf, HIGH_FROM_LOW(0x50+$src1$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 // PUSH src1.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 emit_opcode(cbuf, 0x50+$src1$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 // PUSH src2.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 emit_opcode(cbuf, HIGH_FROM_LOW(0x50+$src2$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 // PUSH src2.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 emit_opcode(cbuf, 0x50+$src2$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 // CALL directly to the runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2829 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 emit_opcode(cbuf,0xE8); // Call into runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2831 emit_d32_reloc(cbuf, (CAST_FROM_FN_PTR(address, SharedRuntime::ldiv) - cbuf.insts_end()) - 4, runtime_call_Relocation::spec(), RELOC_IMM32 );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 // Restore stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 emit_opcode(cbuf, 0x83); // add SP, #framesize
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 emit_rm(cbuf, 0x3, 0x00, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 emit_d8(cbuf, 4*4);
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2837
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 enc_class long_mod( eRegL src1, eRegL src2 ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 // PUSH src1.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 emit_opcode(cbuf, HIGH_FROM_LOW(0x50+$src1$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 // PUSH src1.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 emit_opcode(cbuf, 0x50+$src1$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 // PUSH src2.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 emit_opcode(cbuf, HIGH_FROM_LOW(0x50+$src2$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 // PUSH src2.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 emit_opcode(cbuf, 0x50+$src2$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 // CALL directly to the runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2848 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 emit_opcode(cbuf,0xE8); // Call into runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
2850 emit_d32_reloc(cbuf, (CAST_FROM_FN_PTR(address, SharedRuntime::lrem ) - cbuf.insts_end()) - 4, runtime_call_Relocation::spec(), RELOC_IMM32 );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 // Restore stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 emit_opcode(cbuf, 0x83); // add SP, #framesize
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 emit_rm(cbuf, 0x3, 0x00, ESP_enc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 emit_d8(cbuf, 4*4);
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2856
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2857 enc_class long_cmp_flags0( eRegL src, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 // MOV $tmp,$src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 emit_opcode(cbuf, 0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 emit_rm(cbuf, 0x3, $tmp$$reg, $src$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 // OR $tmp,$src.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 emit_opcode(cbuf, 0x0B);
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2865
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 enc_class long_cmp_flags1( eRegL src1, eRegL src2 ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 // CMP $src1.lo,$src2.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 emit_rm(cbuf, 0x3, $src1$$reg, $src2$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 // JNE,s skip
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 emit_cc(cbuf, 0x70, 0x5);
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 emit_d8(cbuf,2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 // CMP $src1.hi,$src2.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 emit_rm(cbuf, 0x3, HIGH_FROM_LOW($src1$$reg), HIGH_FROM_LOW($src2$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2877
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2878 enc_class long_cmp_flags2( eRegL src1, eRegL src2, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 // CMP $src1.lo,$src2.lo\t! Long compare; set flags for low bits
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 emit_rm(cbuf, 0x3, $src1$$reg, $src2$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 // MOV $tmp,$src1.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 emit_opcode( cbuf, 0x8B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src1$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 // SBB $tmp,$src2.hi\t! Compute flags for long compare
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 emit_opcode( cbuf, 0x1B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src2$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2889
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
2890 enc_class long_cmp_flags3( eRegL src, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 // XOR $tmp,$tmp
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 emit_opcode(cbuf,0x33); // XOR
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 emit_rm(cbuf,0x3, $tmp$$reg, $tmp$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 // CMP $tmp,$src.lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 emit_opcode( cbuf, 0x3B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 emit_rm(cbuf, 0x3, $tmp$$reg, $src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 // SBB $tmp,$src.hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 emit_opcode( cbuf, 0x1B );
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 emit_rm(cbuf, 0x3, $tmp$$reg, HIGH_FROM_LOW($src$$reg) );
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2901
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 // Sniff, sniff... smells like Gnu Superoptimizer
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 enc_class neg_long( eRegL dst ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 emit_opcode(cbuf,0xF7); // NEG hi
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 emit_rm (cbuf,0x3, 0x3, HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 emit_opcode(cbuf,0xF7); // NEG lo
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 emit_rm (cbuf,0x3, 0x3, $dst$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 emit_opcode(cbuf,0x83); // SBB hi,0
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 emit_rm (cbuf,0x3, 0x3, HIGH_FROM_LOW($dst$$reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 emit_d8 (cbuf,0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
2912
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2913
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2914 // Because the transitions from emitted code to the runtime
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2915 // monitorenter/exit helper stubs are so slow it's critical that
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2916 // we inline both the stack-locking fast-path and the inflated fast path.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2917 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2918 // See also: cmpFastLock and cmpFastUnlock.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2919 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2920 // What follows is a specialized inline transliteration of the code
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2921 // in slow_enter() and slow_exit(). If we're concerned about I$ bloat
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2922 // another option would be to emit TrySlowEnter and TrySlowExit methods
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2923 // at startup-time. These methods would accept arguments as
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2924 // (rax,=Obj, rbx=Self, rcx=box, rdx=Scratch) and return success-failure
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2925 // indications in the icc.ZFlag. Fast_Lock and Fast_Unlock would simply
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2926 // marshal the arguments and emit calls to TrySlowEnter and TrySlowExit.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2927 // In practice, however, the # of lock sites is bounded and is usually small.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2928 // Besides the call overhead, TrySlowEnter and TrySlowExit might suffer
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2929 // if the processor uses simple bimodal branch predictors keyed by EIP
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2930 // Since the helper routines would be called from multiple synchronization
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2931 // sites.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2932 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2933 // An even better approach would be write "MonitorEnter()" and "MonitorExit()"
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2934 // in java - using j.u.c and unsafe - and just bind the lock and unlock sites
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2935 // to those specialized methods. That'd give us a mostly platform-independent
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2936 // implementation that the JITs could optimize and inline at their pleasure.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2937 // Done correctly, the only time we'd need to cross to native could would be
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2938 // to park() or unpark() threads. We'd also need a few more unsafe operators
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2939 // to (a) prevent compiler-JIT reordering of non-volatile accesses, and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2940 // (b) explicit barriers or fence operations.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2941 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2942 // TODO:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2943 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2944 // * Arrange for C2 to pass "Self" into Fast_Lock and Fast_Unlock in one of the registers (scr).
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2945 // This avoids manifesting the Self pointer in the Fast_Lock and Fast_Unlock terminals.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2946 // Given TLAB allocation, Self is usually manifested in a register, so passing it into
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2947 // the lock operators would typically be faster than reifying Self.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2948 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2949 // * Ideally I'd define the primitives as:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2950 // fast_lock (nax Obj, nax box, EAX tmp, nax scr) where box, tmp and scr are KILLED.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2951 // fast_unlock (nax Obj, EAX box, nax tmp) where box and tmp are KILLED
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2952 // Unfortunately ADLC bugs prevent us from expressing the ideal form.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2953 // Instead, we're stuck with a rather awkward and brittle register assignments below.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2954 // Furthermore the register assignments are overconstrained, possibly resulting in
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2955 // sub-optimal code near the synchronization site.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2956 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2957 // * Eliminate the sp-proximity tests and just use "== Self" tests instead.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2958 // Alternately, use a better sp-proximity test.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2959 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2960 // * Currently ObjectMonitor._Owner can hold either an sp value or a (THREAD *) value.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2961 // Either one is sufficient to uniquely identify a thread.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2962 // TODO: eliminate use of sp in _owner and use get_thread(tr) instead.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2963 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2964 // * Intrinsify notify() and notifyAll() for the common cases where the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2965 // object is locked by the calling thread but the waitlist is empty.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2966 // avoid the expensive JNI call to JVM_Notify() and JVM_NotifyAll().
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2967 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2968 // * use jccb and jmpb instead of jcc and jmp to improve code density.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2969 // But beware of excessive branch density on AMD Opterons.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2970 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2971 // * Both Fast_Lock and Fast_Unlock set the ICC.ZF to indicate success
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2972 // or failure of the fast-path. If the fast-path fails then we pass
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2973 // control to the slow-path, typically in C. In Fast_Lock and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2974 // Fast_Unlock we often branch to DONE_LABEL, just to find that C2
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2975 // will emit a conditional branch immediately after the node.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2976 // So we have branches to branches and lots of ICC.ZF games.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2977 // Instead, it might be better to have C2 pass a "FailureLabel"
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2978 // into Fast_Lock and Fast_Unlock. In the case of success, control
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2979 // will drop through the node. ICC.ZF is undefined at exit.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2980 // In the case of failure, the node will branch directly to the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2981 // FailureLabel
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2982
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2983
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2984 // obj: object to lock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2985 // box: on-stack box address (displaced header location) - KILLED
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2986 // rax,: tmp -- KILLED
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2987 // scr: tmp -- KILLED
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2988 enc_class Fast_Lock( eRegP obj, eRegP box, eAXRegI tmp, eRegP scr ) %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2989
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2990 Register objReg = as_Register($obj$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2991 Register boxReg = as_Register($box$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2992 Register tmpReg = as_Register($tmp$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2993 Register scrReg = as_Register($scr$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2994
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2995 // Ensure the register assignents are disjoint
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2996 guarantee (objReg != boxReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2997 guarantee (objReg != tmpReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2998 guarantee (objReg != scrReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
2999 guarantee (boxReg != tmpReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3000 guarantee (boxReg != scrReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3001 guarantee (tmpReg == as_Register(EAX_enc), "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3002
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3003 MacroAssembler masm(&cbuf);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3004
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3005 if (_counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3006 masm.atomic_incl(ExternalAddress((address) _counters->total_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3007 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3008 if (EmitSync & 1) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3009 // set box->dhw = unused_mark (3)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3010 // Force all sync thru slow-path: slow_enter() and slow_exit()
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3011 masm.movptr (Address(boxReg, 0), int32_t(markOopDesc::unused_mark())) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3012 masm.cmpptr (rsp, (int32_t)0) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3013 } else
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3014 if (EmitSync & 2) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3015 Label DONE_LABEL ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3016 if (UseBiasedLocking) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3017 // Note: tmpReg maps to the swap_reg argument and scrReg to the tmp_reg argument.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3018 masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, _counters);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3019 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3020
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3021 masm.movptr(tmpReg, Address(objReg, 0)) ; // fetch markword
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3022 masm.orptr (tmpReg, 0x1);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3023 masm.movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3024 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3025 masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3026 masm.jcc(Assembler::equal, DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3027 // Recursive locking
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3028 masm.subptr(tmpReg, rsp);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3029 masm.andptr(tmpReg, (int32_t) 0xFFFFF003 );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3030 masm.movptr(Address(boxReg, 0), tmpReg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3031 masm.bind(DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3032 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3033 // Possible cases that we'll encounter in fast_lock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3034 // ------------------------------------------------
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3035 // * Inflated
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3036 // -- unlocked
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3037 // -- Locked
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3038 // = by self
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3039 // = by other
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3040 // * biased
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3041 // -- by Self
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3042 // -- by other
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3043 // * neutral
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3044 // * stack-locked
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3045 // -- by self
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3046 // = sp-proximity test hits
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3047 // = sp-proximity test generates false-negative
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3048 // -- by other
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3049 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3050
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3051 Label IsInflated, DONE_LABEL, PopDone ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3052
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3053 // TODO: optimize away redundant LDs of obj->mark and improve the markword triage
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3054 // order to reduce the number of conditional branches in the most common cases.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3055 // Beware -- there's a subtle invariant that fetch of the markword
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3056 // at [FETCH], below, will never observe a biased encoding (*101b).
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3057 // If this invariant is not held we risk exclusion (safety) failure.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3058 if (UseBiasedLocking && !UseOptoBiasInlining) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3059 masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, _counters);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3060 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3061
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3062 masm.movptr(tmpReg, Address(objReg, 0)) ; // [FETCH]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3063 masm.testptr(tmpReg, 0x02) ; // Inflated v (Stack-locked or neutral)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3064 masm.jccb (Assembler::notZero, IsInflated) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3065
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3066 // Attempt stack-locking ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3067 masm.orptr (tmpReg, 0x1);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3068 masm.movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3069 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3070 masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3071 if (_counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3072 masm.cond_inc32(Assembler::equal,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3073 ExternalAddress((address)_counters->fast_path_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3074 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3075 masm.jccb (Assembler::equal, DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3076
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3077 // Recursive locking
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3078 masm.subptr(tmpReg, rsp);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3079 masm.andptr(tmpReg, 0xFFFFF003 );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3080 masm.movptr(Address(boxReg, 0), tmpReg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3081 if (_counters != NULL) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3082 masm.cond_inc32(Assembler::equal,
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3083 ExternalAddress((address)_counters->fast_path_entry_count_addr()));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3084 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3085 masm.jmp (DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3086
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3087 masm.bind (IsInflated) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3088
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3089 // The object is inflated.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3090 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3091 // TODO-FIXME: eliminate the ugly use of manifest constants:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3092 // Use markOopDesc::monitor_value instead of "2".
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3093 // use markOop::unused_mark() instead of "3".
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3094 // The tmpReg value is an objectMonitor reference ORed with
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3095 // markOopDesc::monitor_value (2). We can either convert tmpReg to an
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3096 // objectmonitor pointer by masking off the "2" bit or we can just
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3097 // use tmpReg as an objectmonitor pointer but bias the objectmonitor
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3098 // field offsets with "-2" to compensate for and annul the low-order tag bit.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3099 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3100 // I use the latter as it avoids AGI stalls.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3101 // As such, we write "mov r, [tmpReg+OFFSETOF(Owner)-2]"
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3102 // instead of "mov r, [tmpReg+OFFSETOF(Owner)]".
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3103 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3104 #define OFFSET_SKEWED(f) ((ObjectMonitor::f ## _offset_in_bytes())-2)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3105
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3106 // boxReg refers to the on-stack BasicLock in the current frame.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3107 // We'd like to write:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3108 // set box->_displaced_header = markOop::unused_mark(). Any non-0 value suffices.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3109 // This is convenient but results a ST-before-CAS penalty. The following CAS suffers
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3110 // additional latency as we have another ST in the store buffer that must drain.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3111
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3112 if (EmitSync & 8192) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3113 masm.movptr(Address(boxReg, 0), 3) ; // results in ST-before-CAS penalty
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3114 masm.get_thread (scrReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3115 masm.movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3116 masm.movptr(tmpReg, NULL_WORD); // consider: xor vs mov
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3117 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3118 masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3119 } else
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3120 if ((EmitSync & 128) == 0) { // avoid ST-before-CAS
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3121 masm.movptr(scrReg, boxReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3122 masm.movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3123
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3124 // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3125 if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3126 // prefetchw [eax + Offset(_owner)-2]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3127 masm.prefetchw(Address(rax, ObjectMonitor::owner_offset_in_bytes()-2));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3128 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3129
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3130 if ((EmitSync & 64) == 0) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3131 // Optimistic form: consider XORL tmpReg,tmpReg
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3132 masm.movptr(tmpReg, NULL_WORD) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3133 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3134 // Can suffer RTS->RTO upgrades on shared or cold $ lines
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3135 // Test-And-CAS instead of CAS
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3136 masm.movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; // rax, = m->_owner
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3137 masm.testptr(tmpReg, tmpReg) ; // Locked ?
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3138 masm.jccb (Assembler::notZero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3139 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3140
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3141 // Appears unlocked - try to swing _owner from null to non-null.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3142 // Ideally, I'd manifest "Self" with get_thread and then attempt
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3143 // to CAS the register containing Self into m->Owner.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3144 // But we don't have enough registers, so instead we can either try to CAS
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3145 // rsp or the address of the box (in scr) into &m->owner. If the CAS succeeds
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3146 // we later store "Self" into m->Owner. Transiently storing a stack address
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3147 // (rsp or the address of the box) into m->owner is harmless.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3148 // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3149 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3150 masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3151 masm.movptr(Address(scrReg, 0), 3) ; // box->_displaced_header = 3
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3152 masm.jccb (Assembler::notZero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3153 masm.get_thread (scrReg) ; // beware: clobbers ICCs
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3154 masm.movptr(Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2), scrReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3155 masm.xorptr(boxReg, boxReg) ; // set icc.ZFlag = 1 to indicate success
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3156
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3157 // If the CAS fails we can either retry or pass control to the slow-path.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3158 // We use the latter tactic.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3159 // Pass the CAS result in the icc.ZFlag into DONE_LABEL
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3160 // If the CAS was successful ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3161 // Self has acquired the lock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3162 // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3163 // Intentional fall-through into DONE_LABEL ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3164 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3165 masm.movptr(Address(boxReg, 0), 3) ; // results in ST-before-CAS penalty
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3166 masm.movptr(boxReg, tmpReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3167
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3168 // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3169 if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3170 // prefetchw [eax + Offset(_owner)-2]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3171 masm.prefetchw(Address(rax, ObjectMonitor::owner_offset_in_bytes()-2));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3172 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3173
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3174 if ((EmitSync & 64) == 0) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3175 // Optimistic form
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3176 masm.xorptr (tmpReg, tmpReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3177 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3178 // Can suffer RTS->RTO upgrades on shared or cold $ lines
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3179 masm.movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; // rax, = m->_owner
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3180 masm.testptr(tmpReg, tmpReg) ; // Locked ?
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3181 masm.jccb (Assembler::notZero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3182 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3183
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3184 // Appears unlocked - try to swing _owner from null to non-null.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3185 // Use either "Self" (in scr) or rsp as thread identity in _owner.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3186 // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3187 masm.get_thread (scrReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3188 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3189 masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3190
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3191 // If the CAS fails we can either retry or pass control to the slow-path.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3192 // We use the latter tactic.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3193 // Pass the CAS result in the icc.ZFlag into DONE_LABEL
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3194 // If the CAS was successful ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3195 // Self has acquired the lock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3196 // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3197 // Intentional fall-through into DONE_LABEL ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3198 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3199
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3200 // DONE_LABEL is a hot target - we'd really like to place it at the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3201 // start of cache line by padding with NOPs.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3202 // See the AMD and Intel software optimization manuals for the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3203 // most efficient "long" NOP encodings.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3204 // Unfortunately none of our alignment mechanisms suffice.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3205 masm.bind(DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3206
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3207 // Avoid branch-to-branch on AMD processors
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3208 // This appears to be superstition.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3209 if (EmitSync & 32) masm.nop() ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3210
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3211
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3212 // At DONE_LABEL the icc ZFlag is set as follows ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3213 // Fast_Unlock uses the same protocol.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3214 // ZFlag == 1 -> Success
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3215 // ZFlag == 0 -> Failure - force control through the slow-path
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3216 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3217 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3218
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3219 // obj: object to unlock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3220 // box: box address (displaced header location), killed. Must be EAX.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3221 // rbx,: killed tmp; cannot be obj nor box.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3222 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3223 // Some commentary on balanced locking:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3224 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3225 // Fast_Lock and Fast_Unlock are emitted only for provably balanced lock sites.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3226 // Methods that don't have provably balanced locking are forced to run in the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3227 // interpreter - such methods won't be compiled to use fast_lock and fast_unlock.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3228 // The interpreter provides two properties:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3229 // I1: At return-time the interpreter automatically and quietly unlocks any
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3230 // objects acquired the current activation (frame). Recall that the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3231 // interpreter maintains an on-stack list of locks currently held by
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3232 // a frame.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3233 // I2: If a method attempts to unlock an object that is not held by the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3234 // the frame the interpreter throws IMSX.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3235 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3236 // Lets say A(), which has provably balanced locking, acquires O and then calls B().
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3237 // B() doesn't have provably balanced locking so it runs in the interpreter.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3238 // Control returns to A() and A() unlocks O. By I1 and I2, above, we know that O
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3239 // is still locked by A().
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3240 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3241 // The only other source of unbalanced locking would be JNI. The "Java Native Interface:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3242 // Programmer's Guide and Specification" claims that an object locked by jni_monitorenter
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3243 // should not be unlocked by "normal" java-level locking and vice-versa. The specification
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3244 // doesn't specify what will occur if a program engages in such mixed-mode locking, however.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3245
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3246 enc_class Fast_Unlock( nabxRegP obj, eAXRegP box, eRegP tmp) %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3247
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3248 Register objReg = as_Register($obj$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3249 Register boxReg = as_Register($box$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3250 Register tmpReg = as_Register($tmp$$reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3251
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3252 guarantee (objReg != boxReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3253 guarantee (objReg != tmpReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3254 guarantee (boxReg != tmpReg, "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3255 guarantee (boxReg == as_Register(EAX_enc), "") ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3256 MacroAssembler masm(&cbuf);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3257
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3258 if (EmitSync & 4) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3259 // Disable - inhibit all inlining. Force control through the slow-path
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3260 masm.cmpptr (rsp, 0) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3261 } else
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3262 if (EmitSync & 8) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3263 Label DONE_LABEL ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3264 if (UseBiasedLocking) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3265 masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3266 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3267 // classic stack-locking code ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3268 masm.movptr(tmpReg, Address(boxReg, 0)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3269 masm.testptr(tmpReg, tmpReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3270 masm.jcc (Assembler::zero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3271 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3272 masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses EAX which is box
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3273 masm.bind(DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3274 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3275 Label DONE_LABEL, Stacked, CheckSucc, Inflated ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3276
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3277 // Critically, the biased locking test must have precedence over
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3278 // and appear before the (box->dhw == 0) recursive stack-lock test.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3279 if (UseBiasedLocking && !UseOptoBiasInlining) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3280 masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3281 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3282
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3283 masm.cmpptr(Address(boxReg, 0), 0) ; // Examine the displaced header
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3284 masm.movptr(tmpReg, Address(objReg, 0)) ; // Examine the object's markword
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3285 masm.jccb (Assembler::zero, DONE_LABEL) ; // 0 indicates recursive stack-lock
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3286
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3287 masm.testptr(tmpReg, 0x02) ; // Inflated?
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3288 masm.jccb (Assembler::zero, Stacked) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3289
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3290 masm.bind (Inflated) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3291 // It's inflated.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3292 // Despite our balanced locking property we still check that m->_owner == Self
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3293 // as java routines or native JNI code called by this thread might
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3294 // have released the lock.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3295 // Refer to the comments in synchronizer.cpp for how we might encode extra
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3296 // state in _succ so we can avoid fetching EntryList|cxq.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3297 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3298 // I'd like to add more cases in fast_lock() and fast_unlock() --
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3299 // such as recursive enter and exit -- but we have to be wary of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3300 // I$ bloat, T$ effects and BP$ effects.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3301 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3302 // If there's no contention try a 1-0 exit. That is, exit without
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3303 // a costly MEMBAR or CAS. See synchronizer.cpp for details on how
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3304 // we detect and recover from the race that the 1-0 exit admits.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3305 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3306 // Conceptually Fast_Unlock() must execute a STST|LDST "release" barrier
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3307 // before it STs null into _owner, releasing the lock. Updates
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3308 // to data protected by the critical section must be visible before
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3309 // we drop the lock (and thus before any other thread could acquire
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3310 // the lock and observe the fields protected by the lock).
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3311 // IA32's memory-model is SPO, so STs are ordered with respect to
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3312 // each other and there's no need for an explicit barrier (fence).
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3313 // See also http://gee.cs.oswego.edu/dl/jmm/cookbook.html.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3314
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3315 masm.get_thread (boxReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3316 if ((EmitSync & 4096) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3317 // prefetchw [ebx + Offset(_owner)-2]
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3318 masm.prefetchw(Address(rbx, ObjectMonitor::owner_offset_in_bytes()-2));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3319 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3320
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3321 // Note that we could employ various encoding schemes to reduce
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3322 // the number of loads below (currently 4) to just 2 or 3.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3323 // Refer to the comments in synchronizer.cpp.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3324 // In practice the chain of fetches doesn't seem to impact performance, however.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3325 if ((EmitSync & 65536) == 0 && (EmitSync & 256)) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3326 // Attempt to reduce branch density - AMD's branch predictor.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3327 masm.xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3328 masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3329 masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3330 masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3331 masm.jccb (Assembler::notZero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3332 masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3333 masm.jmpb (DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3334 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3335 masm.xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3336 masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3337 masm.jccb (Assembler::notZero, DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3338 masm.movptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3339 masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3340 masm.jccb (Assembler::notZero, CheckSucc) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3341 masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3342 masm.jmpb (DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3343 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3344
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3345 // The Following code fragment (EmitSync & 65536) improves the performance of
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3346 // contended applications and contended synchronization microbenchmarks.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3347 // Unfortunately the emission of the code - even though not executed - causes regressions
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3348 // in scimark and jetstream, evidently because of $ effects. Replacing the code
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3349 // with an equal number of never-executed NOPs results in the same regression.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3350 // We leave it off by default.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3351
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3352 if ((EmitSync & 65536) != 0) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3353 Label LSuccess, LGoSlowPath ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3354
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3355 masm.bind (CheckSucc) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3356
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3357 // Optional pre-test ... it's safe to elide this
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3358 if ((EmitSync & 16) == 0) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3359 masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), 0) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3360 masm.jccb (Assembler::zero, LGoSlowPath) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3361 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3362
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3363 // We have a classic Dekker-style idiom:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3364 // ST m->_owner = 0 ; MEMBAR; LD m->_succ
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3365 // There are a number of ways to implement the barrier:
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3366 // (1) lock:andl &m->_owner, 0
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3367 // is fast, but mask doesn't currently support the "ANDL M,IMM32" form.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3368 // LOCK: ANDL [ebx+Offset(_Owner)-2], 0
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3369 // Encodes as 81 31 OFF32 IMM32 or 83 63 OFF8 IMM8
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3370 // (2) If supported, an explicit MFENCE is appealing.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3371 // In older IA32 processors MFENCE is slower than lock:add or xchg
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3372 // particularly if the write-buffer is full as might be the case if
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3373 // if stores closely precede the fence or fence-equivalent instruction.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3374 // In more modern implementations MFENCE appears faster, however.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3375 // (3) In lieu of an explicit fence, use lock:addl to the top-of-stack
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3376 // The $lines underlying the top-of-stack should be in M-state.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3377 // The locked add instruction is serializing, of course.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3378 // (4) Use xchg, which is serializing
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3379 // mov boxReg, 0; xchgl boxReg, [tmpReg + Offset(_owner)-2] also works
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3380 // (5) ST m->_owner = 0 and then execute lock:orl &m->_succ, 0.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3381 // The integer condition codes will tell us if succ was 0.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3382 // Since _succ and _owner should reside in the same $line and
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3383 // we just stored into _owner, it's likely that the $line
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3384 // remains in M-state for the lock:orl.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3385 //
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3386 // We currently use (3), although it's likely that switching to (2)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3387 // is correct for the future.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3388
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3389 masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3390 if (os::is_MP()) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3391 if (VM_Version::supports_sse2() && 1 == FenceInstruction) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3392 masm.mfence();
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3393 } else {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3394 masm.lock () ; masm.addptr(Address(rsp, 0), 0) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3395 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3396 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3397 // Ratify _succ remains non-null
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3398 masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), 0) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3399 masm.jccb (Assembler::notZero, LSuccess) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3400
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3401 masm.xorptr(boxReg, boxReg) ; // box is really EAX
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3402 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3403 masm.cmpxchgptr(rsp, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3404 masm.jccb (Assembler::notEqual, LSuccess) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3405 // Since we're low on registers we installed rsp as a placeholding in _owner.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3406 // Now install Self over rsp. This is safe as we're transitioning from
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3407 // non-null to non=null
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3408 masm.get_thread (boxReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3409 masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), boxReg) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3410 // Intentional fall-through into LGoSlowPath ...
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3411
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3412 masm.bind (LGoSlowPath) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3413 masm.orptr(boxReg, 1) ; // set ICC.ZF=0 to indicate failure
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3414 masm.jmpb (DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3415
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3416 masm.bind (LSuccess) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3417 masm.xorptr(boxReg, boxReg) ; // set ICC.ZF=1 to indicate success
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3418 masm.jmpb (DONE_LABEL) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3419 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3420
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3421 masm.bind (Stacked) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3422 // It's not inflated and it's not recursively stack-locked and it's not biased.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3423 // It must be stack-locked.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3424 // Try to reset the header to displaced header.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3425 // The "box" value on the stack is stable, so we can reload
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3426 // and be assured we observe the same value as above.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3427 masm.movptr(tmpReg, Address(boxReg, 0)) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3428 if (os::is_MP()) { masm.lock(); }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3429 masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses EAX which is box
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3430 // Intention fall-thru into DONE_LABEL
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3431
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3432
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3433 // DONE_LABEL is a hot target - we'd really like to place it at the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3434 // start of cache line by padding with NOPs.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3435 // See the AMD and Intel software optimization manuals for the
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3436 // most efficient "long" NOP encodings.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3437 // Unfortunately none of our alignment mechanisms suffice.
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3438 if ((EmitSync & 65536) == 0) {
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3439 masm.bind (CheckSucc) ;
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3440 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3441 masm.bind(DONE_LABEL);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3442
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3443 // Avoid branch to branch on AMD processors
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3444 if (EmitSync & 32768) { masm.nop() ; }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3445 }
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3446 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3447
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3448
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 enc_class enc_pop_rdx() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 emit_opcode(cbuf,0x5A);
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3452
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 enc_class enc_rethrow() %{
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3454 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 emit_opcode(cbuf, 0xE9); // jmp entry
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3456 emit_d32_reloc(cbuf, (int)OptoRuntime::rethrow_stub() - ((int)cbuf.insts_end())-4,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 runtime_call_Relocation::spec(), RELOC_IMM32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3459
a61af66fc99e Initial load
duke
parents:
diff changeset
3460
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // Convert a double to an int. Java semantics require we do complex
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 // manglelations in the corner cases. So we set the rounding mode to
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 // 'zero', store the darned double down as an int, and reset the
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 // rounding mode to 'nearest'. The hardware throws an exception which
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 // patches up the correct value directly to the stack.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3466 enc_class DPR2I_encoding( regDPR src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 // Flip to round-to-zero mode. We attempted to allow invalid-op
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 // exceptions here, so that a NAN or other corner-case value will
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 // thrown an exception (but normal values get converted at full speed).
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 // However, I2C adapters and other float-stack manglers leave pending
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 // invalid-op exceptions hanging. We would have to clear them before
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 // enabling them and that is more expensive than just testing for the
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 // invalid value Intel stores down in the corner cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 emit_opcode(cbuf,0xD9); // FLDCW trunc
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 emit_opcode(cbuf,0x2D);
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 emit_d32(cbuf,(int)StubRoutines::addr_fpu_cntrl_wrd_trunc());
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 // Allocate a word
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 emit_opcode(cbuf,0x83); // SUB ESP,4
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 emit_opcode(cbuf,0xEC);
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 emit_d8(cbuf,0x04);
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 // Encoding assumes a double has been pushed into FPR0.
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 // Store down the double as an int, popping the FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 emit_opcode(cbuf,0xDB); // FISTP [ESP]
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 emit_opcode(cbuf,0x1C);
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 emit_d8(cbuf,0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 // Restore the rounding mode; mask the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
3487 emit_opcode(cbuf,0xD9); // FLDCW std/24-bit mode
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 emit_opcode(cbuf,0x2D);
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 emit_d32( cbuf, Compile::current()->in_24_bit_fp_mode()
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 ? (int)StubRoutines::addr_fpu_cntrl_wrd_24()
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 : (int)StubRoutines::addr_fpu_cntrl_wrd_std());
a61af66fc99e Initial load
duke
parents:
diff changeset
3492
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 // Load the converted int; adjust CPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 emit_opcode(cbuf,0x58); // POP EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 emit_opcode(cbuf,0x3D); // CMP EAX,imm
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 emit_d32 (cbuf,0x80000000); // 0x80000000
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 emit_opcode(cbuf,0x75); // JNE around_slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 emit_d8 (cbuf,0x07); // Size of slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 // Push src onto stack slow-path
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 emit_opcode(cbuf,0xD9 ); // FLD ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 emit_d8 (cbuf,0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 // CALL directly to the runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3503 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 emit_opcode(cbuf,0xE8); // Call into runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3505 emit_d32_reloc(cbuf, (StubRoutines::d2i_wrapper() - cbuf.insts_end()) - 4, runtime_call_Relocation::spec(), RELOC_IMM32 );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 // Carry on here...
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3508
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3509 enc_class DPR2L_encoding( regDPR src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 emit_opcode(cbuf,0xD9); // FLDCW trunc
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 emit_opcode(cbuf,0x2D);
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 emit_d32(cbuf,(int)StubRoutines::addr_fpu_cntrl_wrd_trunc());
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 // Allocate a word
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 emit_opcode(cbuf,0x83); // SUB ESP,8
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 emit_opcode(cbuf,0xEC);
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 emit_d8(cbuf,0x08);
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 // Encoding assumes a double has been pushed into FPR0.
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 // Store down the double as a long, popping the FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 emit_opcode(cbuf,0xDF); // FISTP [ESP]
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 emit_opcode(cbuf,0x3C);
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 emit_d8(cbuf,0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 // Restore the rounding mode; mask the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 emit_opcode(cbuf,0xD9); // FLDCW std/24-bit mode
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 emit_opcode(cbuf,0x2D);
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 emit_d32( cbuf, Compile::current()->in_24_bit_fp_mode()
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 ? (int)StubRoutines::addr_fpu_cntrl_wrd_24()
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 : (int)StubRoutines::addr_fpu_cntrl_wrd_std());
a61af66fc99e Initial load
duke
parents:
diff changeset
3528
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 // Load the converted int; adjust CPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 emit_opcode(cbuf,0x58); // POP EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 emit_opcode(cbuf,0x5A); // POP EDX
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 emit_opcode(cbuf,0x81); // CMP EDX,imm
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 emit_d8 (cbuf,0xFA); // rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 emit_d32 (cbuf,0x80000000); // 0x80000000
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 emit_opcode(cbuf,0x75); // JNE around_slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 emit_d8 (cbuf,0x07+4); // Size of slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 emit_opcode(cbuf,0x85); // TEST EAX,EAX
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 emit_opcode(cbuf,0xC0); // 2/rax,/rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 emit_opcode(cbuf,0x75); // JNE around_slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 emit_d8 (cbuf,0x07); // Size of slow_call
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 // Push src onto stack slow-path
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 emit_opcode(cbuf,0xD9 ); // FLD ST(i)
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 emit_d8 (cbuf,0xC0-1+$src$$reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 // CALL directly to the runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3545 cbuf.set_insts_mark();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 emit_opcode(cbuf,0xE8); // Call into runtime
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3547 emit_d32_reloc(cbuf, (StubRoutines::d2l_wrapper() - cbuf.insts_end()) - 4, runtime_call_Relocation::spec(), RELOC_IMM32 );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 // Carry on here...
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3550
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3551 enc_class FMul_ST_reg( eRegFPR src1 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 // Operand was loaded from memory into fp ST (stack top)
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 // FMUL ST,$src /* D8 C8+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 emit_opcode(cbuf, 0xC8 + $src1$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3557
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3558 enc_class FAdd_ST_reg( eRegFPR src2 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 // FADDP ST,src2 /* D8 C0+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 emit_opcode(cbuf, 0xC0 + $src2$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 //could use FADDP src2,fpST /* DE C0+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3564
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3565 enc_class FAddP_reg_ST( eRegFPR src2 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 // FADDP src2,ST /* DE C0+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 emit_opcode(cbuf, 0xDE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 emit_opcode(cbuf, 0xC0 + $src2$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3570
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3571 enc_class subFPR_divFPR_encode( eRegFPR src1, eRegFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 // Operand has been loaded into fp ST (stack top)
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 // FSUB ST,$src1
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 emit_opcode(cbuf, 0xE0 + $src1$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3576
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 // FDIV
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 emit_opcode(cbuf, 0xF0 + $src2$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3581
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3582 enc_class MulFAddF (eRegFPR src1, eRegFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 // Operand was loaded from memory into fp ST (stack top)
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 // FADD ST,$src /* D8 C0+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 emit_opcode(cbuf, 0xC0 + $src1$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3587
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 // FMUL ST,src2 /* D8 C*+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 emit_opcode(cbuf, 0xC8 + $src2$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3592
a61af66fc99e Initial load
duke
parents:
diff changeset
3593
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
3594 enc_class MulFAddFreverse (eRegFPR src1, eRegFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 // Operand was loaded from memory into fp ST (stack top)
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 // FADD ST,$src /* D8 C0+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 emit_opcode(cbuf, 0xD8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 emit_opcode(cbuf, 0xC0 + $src1$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3599
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 // FMULP src2,ST /* DE C8+i */
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 emit_opcode(cbuf, 0xDE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 emit_opcode(cbuf, 0xC8 + $src2$$reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3604
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 // Atomically load the volatile long
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 enc_class enc_loadL_volatile( memory mem, stackSlotL dst ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 emit_opcode(cbuf,0xDF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 int rm_byte_opcode = 0x05;
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
3613 relocInfo::relocType disp_reloc = $mem->disp_reloc(); // disp-as-oop when working with static globals
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
3614 encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 store_to_stackslot( cbuf, 0x0DF, 0x07, $dst$$disp );
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3617
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 // Volatile Store Long. Must be atomic, so move it into
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 // the FP TOS and then do a 64-bit FIST. Has to probe the
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 // target address before the store (for null-ptr checks)
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 // so the memory operand is used twice in the encoding.
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 enc_class enc_storeL_volatile( memory mem, stackSlotL src ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 store_to_stackslot( cbuf, 0x0DF, 0x05, $src$$disp );
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3624 cbuf.set_insts_mark(); // Mark start of FIST in case $mem has an oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 emit_opcode(cbuf,0xDF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 int rm_byte_opcode = 0x07;
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 int base = $mem$$base;
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 int index = $mem$$index;
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 int scale = $mem$$scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 int displace = $mem$$disp;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
3631 relocInfo::relocType disp_reloc = $mem->disp_reloc(); // disp-as-oop when working with static globals
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
3632 encode_RegMem(cbuf, rm_byte_opcode, base, index, scale, displace, disp_reloc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3634
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 // Safepoint Poll. This polls the safepoint page, and causes an
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 // exception if it is not readable. Unfortunately, it kills the condition code
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 // in the process
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 // We current use TESTL [spp],EDI
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 // A better choice might be TESTB [spp + pagesize() - CacheLineSize()],0
a61af66fc99e Initial load
duke
parents:
diff changeset
3640
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 enc_class Safepoint_Poll() %{
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1730
diff changeset
3642 cbuf.relocate(cbuf.insts_mark(), relocInfo::poll_type, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 emit_opcode(cbuf,0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 emit_rm (cbuf, 0x0, 0x7, 0x5);
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 emit_d32(cbuf, (intptr_t)os::get_polling_page());
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3648
a61af66fc99e Initial load
duke
parents:
diff changeset
3649
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 //----------FRAME--------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 // Definition of frame structure and management information.
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 // S T A C K L A Y O U T Allocators stack-slot number
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 // | (to get allocators register number
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 // G Owned by | | v add OptoReg::stack0())
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 // r CALLER | |
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 // o | +--------+ pad to even-align allocators stack-slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 // w V | pad0 | numbers; owned by CALLER
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 // t -----------+--------+----> Matcher::_in_arg_limit, unaligned
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 // h ^ | in | 5
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 // | | args | 4 Holes in incoming args owned by SELF
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 // | | | | 3
a61af66fc99e Initial load
duke
parents:
diff changeset
3663 // | | +--------+
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 // V | | old out| Empty on Intel, window on Sparc
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 // | old |preserve| Must be even aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 // | SP-+--------+----> Matcher::_old_SP, even aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 // | | in | 3 area for Intel ret address
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 // Owned by |preserve| Empty on Sparc.
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 // SELF +--------+
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 // | | pad2 | 2 pad to align old SP
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 // | +--------+ 1
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 // | | locks | 0
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 // | +--------+----> OptoReg::stack0(), even aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 // | | pad1 | 11 pad to align new SP
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 // | +--------+
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 // | | | 10
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 // | | spills | 9 spills
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 // V | | 8 (pad0 slot for callee)
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 // -----------+--------+----> Matcher::_out_arg_limit, unaligned
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 // ^ | out | 7
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 // | | args | 6 Holes in outgoing args owned by CALLEE
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 // Owned by +--------+
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 // CALLEE | new out| 6 Empty on Intel, window on Sparc
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 // | new |preserve| Must be even-aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 // | SP-+--------+----> Matcher::_new_SP, even aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 // | | |
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 // Note 1: Only region 8-11 is determined by the allocator. Region 0-5 is
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 // known from SELF's arguments and the Java calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 // Region 6-7 is determined per call site.
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 // Note 2: If the calling convention leaves holes in the incoming argument
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 // area, those holes are owned by SELF. Holes in the outgoing area
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 // are owned by the CALLEE. Holes should not be nessecary in the
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 // incoming area, as the Java calling convention is completely under
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 // the control of the AD file. Doubles can be sorted and packed to
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 // avoid holes. Holes in the outgoing arguments may be nessecary for
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 // varargs C calling conventions.
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 // Note 3: Region 0-3 is even aligned, with pad2 as needed. Region 3-5 is
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 // even aligned with pad0 as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 // Region 6 is even aligned. Region 6-7 is NOT even aligned;
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 // region 6-11 is even aligned; it may be padded out more so that
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 // the region from SP to FP meets the minimum stack alignment.
a61af66fc99e Initial load
duke
parents:
diff changeset
3703
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 frame %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 // What direction does stack grow in (assumed to be same for C & Java)
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 stack_direction(TOWARDS_LOW);
a61af66fc99e Initial load
duke
parents:
diff changeset
3707
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 // These three registers define part of the calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 // between compiled code and the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 inline_cache_reg(EAX); // Inline Cache Register
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 interpreter_method_oop_reg(EBX); // Method Oop Register when calling interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
3712
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 // Optional: name the operand used by cisc-spilling to access [stack_pointer + offset]
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 cisc_spilling_operand_name(indOffset32);
a61af66fc99e Initial load
duke
parents:
diff changeset
3715
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 // Number of stack slots consumed by locking an object
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 sync_stack_slots(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3718
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 // Compiled code's Frame Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 frame_pointer(ESP);
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 // Interpreter stores its frame pointer in a register which is
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 // stored to the stack by I2CAdaptors.
a61af66fc99e Initial load
duke
parents:
diff changeset
3723 // I2CAdaptors convert from interpreted java to compiled java.
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 interpreter_frame_pointer(EBP);
a61af66fc99e Initial load
duke
parents:
diff changeset
3725
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 // Stack alignment requirement
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 // Alignment size in bytes (128-bit -> 16 bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
3728 stack_alignment(StackAlignmentInBytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
3729
a61af66fc99e Initial load
duke
parents:
diff changeset
3730 // Number of stack slots between incoming argument block and the start of
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 // a new frame. The PROLOG must add this many slots to the stack. The
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 // EPILOG must remove this many slots. Intel needs one slot for
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 // return address and one for rbp, (must save rbp)
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 in_preserve_stack_slots(2+VerifyStackAtCalls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3735
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 // Number of outgoing stack slots killed above the out_preserve_stack_slots
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 // for calls to C. Supports the var-args backing area for register parms.
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 varargs_C_out_slots_killed(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3739
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 // The after-PROLOG location of the return address. Location of
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 // return address specifies a type (REG or STACK) and a number
a61af66fc99e Initial load
duke
parents:
diff changeset
3742 // representing the register number (i.e. - use a register name) or
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 // stack slot.
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 // Ret Addr is on stack in slot 0 if no locks or verification or alignment.
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 // Otherwise, it is above the locks and verification slot and alignment word
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 return_addr(STACK - 1 +
4950
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
3747 round_to((Compile::current()->in_preserve_stack_slots() +
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
3748 Compile::current()->fixed_slots()),
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
3749 stack_alignment_in_slots()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3750
a61af66fc99e Initial load
duke
parents:
diff changeset
3751 // Body of function which returns an integer array locating
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 // arguments either in registers or in stack slots. Passed an array
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 // of ideal registers called "sig" and a "length" count. Stack-slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 // offsets are based on outgoing arguments, i.e. a CALLER setting up
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 // arguments for a CALLEE. Incoming stack arguments are
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 // automatically biased by the preserve_stack_slots field above.
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 calling_convention %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3758 // No difference between ingoing/outgoing just pass false
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 SharedRuntime::java_calling_convention(sig_bt, regs, length, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3761
a61af66fc99e Initial load
duke
parents:
diff changeset
3762
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 // Body of function which returns an integer array locating
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 // arguments either in registers or in stack slots. Passed an array
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 // of ideal registers called "sig" and a "length" count. Stack-slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 // offsets are based on outgoing arguments, i.e. a CALLER setting up
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 // arguments for a CALLEE. Incoming stack arguments are
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 // automatically biased by the preserve_stack_slots field above.
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 c_calling_convention %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 // This is obviously always outgoing
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
3771 (void) SharedRuntime::c_calling_convention(sig_bt, regs, length);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3773
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 // Location of C & interpreter return values
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 c_return_value %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 assert( ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values" );
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 71
diff changeset
3777 static int lo[Op_RegL+1] = { 0, 0, OptoReg::Bad, EAX_num, EAX_num, FPR1L_num, FPR1L_num, EAX_num };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 71
diff changeset
3778 static int hi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, FPR1H_num, EDX_num };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3779
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 // in SSE2+ mode we want to keep the FPU stack clean so pretend
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 // that C functions return float and double results in XMM0.
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 if( ideal_reg == Op_RegD && UseSSE>=2 )
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
3783 return OptoRegPair(XMM0b_num,XMM0_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 if( ideal_reg == Op_RegF && UseSSE>=2 )
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
3785 return OptoRegPair(OptoReg::Bad,XMM0_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3786
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3789
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 // Location of return values
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 return_value %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 assert( ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values" );
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 71
diff changeset
3793 static int lo[Op_RegL+1] = { 0, 0, OptoReg::Bad, EAX_num, EAX_num, FPR1L_num, FPR1L_num, EAX_num };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 71
diff changeset
3794 static int hi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, OptoReg::Bad, FPR1H_num, EDX_num };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 if( ideal_reg == Op_RegD && UseSSE>=2 )
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
3796 return OptoRegPair(XMM0b_num,XMM0_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 if( ideal_reg == Op_RegF && UseSSE>=1 )
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
3798 return OptoRegPair(OptoReg::Bad,XMM0_num);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3799 return OptoRegPair(hi[ideal_reg],lo[ideal_reg]);
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3801
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3803
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 //----------ATTRIBUTES---------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 //----------Operand Attributes-------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 op_attrib op_cost(0); // Required cost attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
3807
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 //----------Instruction Attributes---------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 ins_attrib ins_cost(100); // Required cost attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
3810 ins_attrib ins_size(8); // Required size attribute (in bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 ins_attrib ins_short_branch(0); // Required flag: is this instruction a
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 // non-matching short branch variant of some
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 // long branch?
a61af66fc99e Initial load
duke
parents:
diff changeset
3814 ins_attrib ins_alignment(1); // Required alignment attribute (must be a power of 2)
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 // specifies the alignment that some part of the instruction (not
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 // necessarily the start) requires. If > 1, a compute_padding()
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 // function must be provided for the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
3818
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 //----------OPERANDS-----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 // Operand definitions must precede instruction definitions for correct parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 // in the ADLC because operands constitute user defined types which are used in
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 // instruction definitions.
a61af66fc99e Initial load
duke
parents:
diff changeset
3823
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 //----------Simple Operands----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 // Immediate Operands
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 // Integer Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 operand immI() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3829
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3834
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 // Constant for test vs zero
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 operand immI0() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 predicate(n->get_int() == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3839
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3844
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 // Constant for increment
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 operand immI1() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 predicate(n->get_int() == 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3849
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3852 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3854
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 // Constant for decrement
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 operand immI_M1() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 predicate(n->get_int() == -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3859
a61af66fc99e Initial load
duke
parents:
diff changeset
3860 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3864
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 // Valid scale values for addressing modes
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 operand immI2() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 predicate(0 <= n->get_int() && (n->get_int() <= 3));
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3869
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3873
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 operand immI8() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3875 predicate((-128 <= n->get_int()) && (n->get_int() <= 127));
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3877
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3882
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 operand immI16() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 predicate((-32768 <= n->get_int()) && (n->get_int() <= 32767));
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3886
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3890 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3891
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 // Constant for long shifts
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 operand immI_32() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 predicate( n->get_int() == 32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3896
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3898 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3899 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3901
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 operand immI_1_31() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 predicate( n->get_int() >= 1 && n->get_int() <= 31 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3905
a61af66fc99e Initial load
duke
parents:
diff changeset
3906 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3910
a61af66fc99e Initial load
duke
parents:
diff changeset
3911 operand immI_32_63() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 predicate( n->get_int() >= 32 && n->get_int() <= 63 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3913 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3915
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3919
219
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3920 operand immI_1() %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3921 predicate( n->get_int() == 1 );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3922 match(ConI);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3923
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3924 op_cost(0);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3925 format %{ %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3926 interface(CONST_INTER);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3927 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3928
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3929 operand immI_2() %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3930 predicate( n->get_int() == 2 );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3931 match(ConI);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3932
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3933 op_cost(0);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3934 format %{ %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3935 interface(CONST_INTER);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3936 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3937
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3938 operand immI_3() %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3939 predicate( n->get_int() == 3 );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3940 match(ConI);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3941
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3942 op_cost(0);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3943 format %{ %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3944 interface(CONST_INTER);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3945 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
3946
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 // Pointer Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 operand immP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 match(ConP);
a61af66fc99e Initial load
duke
parents:
diff changeset
3950
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3953 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3955
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 // NULL Pointer Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 operand immP0() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 predicate( n->get_ptr() == 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 match(ConP);
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
a61af66fc99e Initial load
duke
parents:
diff changeset
3962 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3964 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3965
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 // Long Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 operand immL() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 match(ConL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3969
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 op_cost(20);
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3974
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 // Long Immediate zero
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 operand immL0() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 predicate( n->get_long() == 0L );
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 match(ConL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3980
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
3984
403
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3985 // Long Immediate zero
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3986 operand immL_M1() %{
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3987 predicate( n->get_long() == -1L );
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3988 match(ConL);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3989 op_cost(0);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3990
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3991 format %{ %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3992 interface(CONST_INTER);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3993 %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
3994
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 // Long immediate from 0 to 127.
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 // Used for a shorter form of long mul by 10.
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 operand immL_127() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 predicate((0 <= n->get_long()) && (n->get_long() <= 127));
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 match(ConL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4000 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4001
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4005
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 // Long Immediate: low 32-bit mask
a61af66fc99e Initial load
duke
parents:
diff changeset
4007 operand immL_32bits() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 predicate(n->get_long() == 0xFFFFFFFFL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 match(ConL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 op_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4011
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4013 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4015
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 // Long Immediate: low 32-bit mask
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 operand immL32() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4018 predicate(n->get_long() == (int)(n->get_long()));
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 match(ConL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 op_cost(20);
a61af66fc99e Initial load
duke
parents:
diff changeset
4021
a61af66fc99e Initial load
duke
parents:
diff changeset
4022 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4025
a61af66fc99e Initial load
duke
parents:
diff changeset
4026 //Double Immediate zero
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4027 operand immDPR0() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 // Do additional (and counter-intuitive) test against NaN to work around VC++
a61af66fc99e Initial load
duke
parents:
diff changeset
4029 // bug that generates code such that NaNs compare equal to 0.0
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 predicate( UseSSE<=1 && n->getd() == 0.0 && !g_isnan(n->getd()) );
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 match(ConD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4032
a61af66fc99e Initial load
duke
parents:
diff changeset
4033 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4037
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4038 // Double Immediate one
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4039 operand immDPR1() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 predicate( UseSSE<=1 && n->getd() == 1.0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 match(ConD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4042
a61af66fc99e Initial load
duke
parents:
diff changeset
4043 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4044 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4047
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 // Double Immediate
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4049 operand immDPR() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 match(ConD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4052
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4056 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4057
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4058 operand immD() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4059 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 match(ConD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4061
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4066
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 // Double Immediate zero
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4068 operand immD0() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4069 // Do additional (and counter-intuitive) test against NaN to work around VC++
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 // bug that generates code such that NaNs compare equal to 0.0 AND do not
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 // compare equal to -0.0.
a61af66fc99e Initial load
duke
parents:
diff changeset
4072 predicate( UseSSE>=2 && jlong_cast(n->getd()) == 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4073 match(ConD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4074
a61af66fc99e Initial load
duke
parents:
diff changeset
4075 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4078
a61af66fc99e Initial load
duke
parents:
diff changeset
4079 // Float Immediate zero
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4080 operand immFPR0() %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4081 predicate(UseSSE == 0 && n->getf() == 0.0F);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4082 match(ConF);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4083
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4084 op_cost(5);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4085 format %{ %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4086 interface(CONST_INTER);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4087 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4088
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4089 // Float Immediate one
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4090 operand immFPR1() %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
4091 predicate(UseSSE == 0 && n->getf() == 1.0F);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 match(ConF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4093
a61af66fc99e Initial load
duke
parents:
diff changeset
4094 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4095 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4096 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4098
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 // Float Immediate
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4100 operand immFPR() %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4101 predicate( UseSSE == 0 );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4102 match(ConF);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4103
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4104 op_cost(5);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4105 format %{ %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4106 interface(CONST_INTER);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4107 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4108
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4109 // Float Immediate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4110 operand immF() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 predicate(UseSSE >= 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
4112 match(ConF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4113
a61af66fc99e Initial load
duke
parents:
diff changeset
4114 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4115 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4116 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4117 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4118
a61af66fc99e Initial load
duke
parents:
diff changeset
4119 // Float Immediate zero. Zero and not -0.0
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4120 operand immF0() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 predicate( UseSSE >= 1 && jint_cast(n->getf()) == 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4122 match(ConF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4123
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 op_cost(5);
a61af66fc99e Initial load
duke
parents:
diff changeset
4125 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4126 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4127 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4128
a61af66fc99e Initial load
duke
parents:
diff changeset
4129 // Immediates for special shifts (sign extend)
a61af66fc99e Initial load
duke
parents:
diff changeset
4130
a61af66fc99e Initial load
duke
parents:
diff changeset
4131 // Constants for increment
a61af66fc99e Initial load
duke
parents:
diff changeset
4132 operand immI_16() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4133 predicate( n->get_int() == 16 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4134 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4135
a61af66fc99e Initial load
duke
parents:
diff changeset
4136 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4137 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4138 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4139
a61af66fc99e Initial load
duke
parents:
diff changeset
4140 operand immI_24() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4141 predicate( n->get_int() == 24 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4143
a61af66fc99e Initial load
duke
parents:
diff changeset
4144 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4145 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4146 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4147
a61af66fc99e Initial load
duke
parents:
diff changeset
4148 // Constant for byte-wide masking
a61af66fc99e Initial load
duke
parents:
diff changeset
4149 operand immI_255() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4150 predicate( n->get_int() == 255 );
a61af66fc99e Initial load
duke
parents:
diff changeset
4151 match(ConI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4152
a61af66fc99e Initial load
duke
parents:
diff changeset
4153 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4154 interface(CONST_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4155 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4156
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4157 // Constant for short-wide masking
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4158 operand immI_65535() %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4159 predicate(n->get_int() == 65535);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4160 match(ConI);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4161
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4162 format %{ %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4163 interface(CONST_INTER);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4164 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
4165
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4166 // Register Operands
a61af66fc99e Initial load
duke
parents:
diff changeset
4167 // Integer Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4168 operand rRegI() %{
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4169 constraint(ALLOC_IN_RC(int_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4170 match(RegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4171 match(xRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4172 match(eAXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4173 match(eBXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4174 match(eCXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 match(eDXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 match(eDIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4177 match(eSIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4178
a61af66fc99e Initial load
duke
parents:
diff changeset
4179 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4180 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4181 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4182
a61af66fc99e Initial load
duke
parents:
diff changeset
4183 // Subset of Integer Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4184 operand xRegI(rRegI reg) %{
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4185 constraint(ALLOC_IN_RC(int_x_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4186 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4187 match(eAXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4188 match(eBXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4189 match(eCXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4190 match(eDXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4191
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4193 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4194 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4195
a61af66fc99e Initial load
duke
parents:
diff changeset
4196 // Special Registers
a61af66fc99e Initial load
duke
parents:
diff changeset
4197 operand eAXRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4198 constraint(ALLOC_IN_RC(eax_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4199 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4200 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4201
a61af66fc99e Initial load
duke
parents:
diff changeset
4202 format %{ "EAX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4203 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4204 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4205
a61af66fc99e Initial load
duke
parents:
diff changeset
4206 // Special Registers
a61af66fc99e Initial load
duke
parents:
diff changeset
4207 operand eBXRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4208 constraint(ALLOC_IN_RC(ebx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4209 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4210 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4211
a61af66fc99e Initial load
duke
parents:
diff changeset
4212 format %{ "EBX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4213 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4214 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4215
a61af66fc99e Initial load
duke
parents:
diff changeset
4216 operand eCXRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4217 constraint(ALLOC_IN_RC(ecx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4218 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4219 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4220
a61af66fc99e Initial load
duke
parents:
diff changeset
4221 format %{ "ECX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4222 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4223 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4224
a61af66fc99e Initial load
duke
parents:
diff changeset
4225 operand eDXRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4226 constraint(ALLOC_IN_RC(edx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4227 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4228 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4229
a61af66fc99e Initial load
duke
parents:
diff changeset
4230 format %{ "EDX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4231 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4232 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4233
a61af66fc99e Initial load
duke
parents:
diff changeset
4234 operand eDIRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4235 constraint(ALLOC_IN_RC(edi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4236 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4237 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4238
a61af66fc99e Initial load
duke
parents:
diff changeset
4239 format %{ "EDI" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4240 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4241 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4242
a61af66fc99e Initial load
duke
parents:
diff changeset
4243 operand naxRegI() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4244 constraint(ALLOC_IN_RC(nax_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4245 match(RegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4246 match(eCXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4247 match(eDXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4248 match(eSIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4249 match(eDIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4250
a61af66fc99e Initial load
duke
parents:
diff changeset
4251 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4252 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4253 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4254
a61af66fc99e Initial load
duke
parents:
diff changeset
4255 operand nadxRegI() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4256 constraint(ALLOC_IN_RC(nadx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4257 match(RegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4258 match(eBXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4259 match(eCXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4260 match(eSIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4261 match(eDIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4262
a61af66fc99e Initial load
duke
parents:
diff changeset
4263 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4264 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4265 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4266
a61af66fc99e Initial load
duke
parents:
diff changeset
4267 operand ncxRegI() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4268 constraint(ALLOC_IN_RC(ncx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4269 match(RegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4270 match(eAXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4271 match(eDXRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4272 match(eSIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4273 match(eDIRegI);
a61af66fc99e Initial load
duke
parents:
diff changeset
4274
a61af66fc99e Initial load
duke
parents:
diff changeset
4275 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4276 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4277 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4278
a61af66fc99e Initial load
duke
parents:
diff changeset
4279 // // This operand was used by cmpFastUnlock, but conflicted with 'object' reg
a61af66fc99e Initial load
duke
parents:
diff changeset
4280 // //
a61af66fc99e Initial load
duke
parents:
diff changeset
4281 operand eSIRegI(xRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4282 constraint(ALLOC_IN_RC(esi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4283 match(reg);
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4284 match(rRegI);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4285
a61af66fc99e Initial load
duke
parents:
diff changeset
4286 format %{ "ESI" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4287 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4288 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4289
a61af66fc99e Initial load
duke
parents:
diff changeset
4290 // Pointer Register
a61af66fc99e Initial load
duke
parents:
diff changeset
4291 operand anyRegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4292 constraint(ALLOC_IN_RC(any_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4293 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4294 match(eAXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4295 match(eBXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4296 match(eCXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4297 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4298 match(eRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4299
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4302 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4303
a61af66fc99e Initial load
duke
parents:
diff changeset
4304 operand eRegP() %{
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4305 constraint(ALLOC_IN_RC(int_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4307 match(eAXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4308 match(eBXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4309 match(eCXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4310 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4311
a61af66fc99e Initial load
duke
parents:
diff changeset
4312 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4314 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4315
a61af66fc99e Initial load
duke
parents:
diff changeset
4316 // On windows95, EBP is not safe to use for implicit null tests.
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 operand eRegP_no_EBP() %{
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4318 constraint(ALLOC_IN_RC(int_reg_no_rbp));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4319 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 match(eAXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4321 match(eBXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4322 match(eCXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4323 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4324
a61af66fc99e Initial load
duke
parents:
diff changeset
4325 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4327 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4329
a61af66fc99e Initial load
duke
parents:
diff changeset
4330 operand naxRegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4331 constraint(ALLOC_IN_RC(nax_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4332 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4333 match(eBXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4334 match(eDXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4335 match(eCXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4336 match(eSIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4338
a61af66fc99e Initial load
duke
parents:
diff changeset
4339 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4340 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4341 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4342
a61af66fc99e Initial load
duke
parents:
diff changeset
4343 operand nabxRegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 constraint(ALLOC_IN_RC(nabx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4346 match(eCXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 match(eDXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4348 match(eSIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4349 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4350
a61af66fc99e Initial load
duke
parents:
diff changeset
4351 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4352 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4353 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4354
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 operand pRegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 constraint(ALLOC_IN_RC(p_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4358 match(eBXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 match(eDXRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4360 match(eSIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4361 match(eDIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4362
a61af66fc99e Initial load
duke
parents:
diff changeset
4363 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4365 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4366
a61af66fc99e Initial load
duke
parents:
diff changeset
4367 // Special Registers
a61af66fc99e Initial load
duke
parents:
diff changeset
4368 // Return a pointer value
a61af66fc99e Initial load
duke
parents:
diff changeset
4369 operand eAXRegP(eRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4370 constraint(ALLOC_IN_RC(eax_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4372 format %{ "EAX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4373 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4374 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4375
a61af66fc99e Initial load
duke
parents:
diff changeset
4376 // Used in AtomicAdd
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 operand eBXRegP(eRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4378 constraint(ALLOC_IN_RC(ebx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4379 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4380 format %{ "EBX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4381 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4383
a61af66fc99e Initial load
duke
parents:
diff changeset
4384 // Tail-call (interprocedural jump) to interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
4385 operand eCXRegP(eRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4386 constraint(ALLOC_IN_RC(ecx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4387 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4388 format %{ "ECX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4389 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4391
a61af66fc99e Initial load
duke
parents:
diff changeset
4392 operand eSIRegP(eRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4393 constraint(ALLOC_IN_RC(esi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 format %{ "ESI" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4398
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 // Used in rep stosw
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 operand eDIRegP(eRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 constraint(ALLOC_IN_RC(edi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 format %{ "EDI" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4405 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4406
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 operand eBPRegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 constraint(ALLOC_IN_RC(ebp_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4409 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4410 format %{ "EBP" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4411 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4412 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4413
a61af66fc99e Initial load
duke
parents:
diff changeset
4414 operand eRegL() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4415 constraint(ALLOC_IN_RC(long_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4416 match(RegL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4417 match(eADXRegL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4418
a61af66fc99e Initial load
duke
parents:
diff changeset
4419 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4420 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4422
a61af66fc99e Initial load
duke
parents:
diff changeset
4423 operand eADXRegL( eRegL reg ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4424 constraint(ALLOC_IN_RC(eadx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4425 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4426
a61af66fc99e Initial load
duke
parents:
diff changeset
4427 format %{ "EDX:EAX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4429 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4430
a61af66fc99e Initial load
duke
parents:
diff changeset
4431 operand eBCXRegL( eRegL reg ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 constraint(ALLOC_IN_RC(ebcx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4434
a61af66fc99e Initial load
duke
parents:
diff changeset
4435 format %{ "EBX:ECX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4436 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4437 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4438
a61af66fc99e Initial load
duke
parents:
diff changeset
4439 // Special case for integer high multiply
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 operand eADXRegL_low_only() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4441 constraint(ALLOC_IN_RC(eadx_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 match(RegL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4443
a61af66fc99e Initial load
duke
parents:
diff changeset
4444 format %{ "EAX" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4445 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4446 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4447
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 // Flags register, used as output of compare instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
4449 operand eFlagsReg() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4450 constraint(ALLOC_IN_RC(int_flags));
a61af66fc99e Initial load
duke
parents:
diff changeset
4451 match(RegFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
4452
a61af66fc99e Initial load
duke
parents:
diff changeset
4453 format %{ "EFLAGS" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4454 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4455 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4456
a61af66fc99e Initial load
duke
parents:
diff changeset
4457 // Flags register, used as output of FLOATING POINT compare instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
4458 operand eFlagsRegU() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4459 constraint(ALLOC_IN_RC(int_flags));
a61af66fc99e Initial load
duke
parents:
diff changeset
4460 match(RegFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
4461
a61af66fc99e Initial load
duke
parents:
diff changeset
4462 format %{ "EFLAGS_U" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4463 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4464 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4465
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4466 operand eFlagsRegUCF() %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4467 constraint(ALLOC_IN_RC(int_flags));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4468 match(RegFlags);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4469 predicate(false);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4470
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4471 format %{ "EFLAGS_U_CF" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4472 interface(REG_INTER);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4473 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4474
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4475 // Condition Code Register used by long compare
a61af66fc99e Initial load
duke
parents:
diff changeset
4476 operand flagsReg_long_LTGE() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4477 constraint(ALLOC_IN_RC(int_flags));
a61af66fc99e Initial load
duke
parents:
diff changeset
4478 match(RegFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
4479 format %{ "FLAGS_LTGE" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4480 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4481 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4482 operand flagsReg_long_EQNE() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4483 constraint(ALLOC_IN_RC(int_flags));
a61af66fc99e Initial load
duke
parents:
diff changeset
4484 match(RegFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
4485 format %{ "FLAGS_EQNE" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4486 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4487 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4488 operand flagsReg_long_LEGT() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4489 constraint(ALLOC_IN_RC(int_flags));
a61af66fc99e Initial load
duke
parents:
diff changeset
4490 match(RegFlags);
a61af66fc99e Initial load
duke
parents:
diff changeset
4491 format %{ "FLAGS_LEGT" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4492 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4493 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4494
a61af66fc99e Initial load
duke
parents:
diff changeset
4495 // Float register operands
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4496 operand regDPR() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4497 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4498 constraint(ALLOC_IN_RC(fp_dbl_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4499 match(RegD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4500 match(regDPR1);
a61af66fc99e Initial load
duke
parents:
diff changeset
4501 match(regDPR2);
a61af66fc99e Initial load
duke
parents:
diff changeset
4502 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4503 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4504 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4505
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4506 operand regDPR1(regDPR reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4507 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4508 constraint(ALLOC_IN_RC(fp_dbl_reg0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4509 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4510 format %{ "FPR1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4511 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4512 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4513
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4514 operand regDPR2(regDPR reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4515 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4516 constraint(ALLOC_IN_RC(fp_dbl_reg1));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4517 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4518 format %{ "FPR2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4519 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4520 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4521
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4522 operand regnotDPR1(regDPR reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4523 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4524 constraint(ALLOC_IN_RC(fp_dbl_notreg0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4525 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4526 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4527 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4528 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4529
a61af66fc99e Initial load
duke
parents:
diff changeset
4530 // Float register operands
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4531 operand regFPR() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4532 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4533 constraint(ALLOC_IN_RC(fp_flt_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4534 match(RegF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4535 match(regFPR1);
a61af66fc99e Initial load
duke
parents:
diff changeset
4536 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4538 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4539
a61af66fc99e Initial load
duke
parents:
diff changeset
4540 // Float register operands
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4541 operand regFPR1(regFPR reg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4542 predicate( UseSSE < 2 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4543 constraint(ALLOC_IN_RC(fp_flt_reg0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4544 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4545 format %{ "FPR1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4546 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4547 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4548
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4549 // XMM Float register operands
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
4550 operand regF() %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4551 predicate( UseSSE>=1 );
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4552 constraint(ALLOC_IN_RC(float_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 match(RegF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4554 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4555 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4556 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4557
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4558 // XMM Double register operands
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4559 operand regD() %{
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4560 predicate( UseSSE>=2 );
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4561 constraint(ALLOC_IN_RC(double_reg));
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4562 match(RegD);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4563 format %{ %}
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4564 interface(REG_INTER);
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4565 %}
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4566
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4567
a61af66fc99e Initial load
duke
parents:
diff changeset
4568 //----------Memory Operands----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4569 // Direct Memory Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4570 operand direct(immP addr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4571 match(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4572
a61af66fc99e Initial load
duke
parents:
diff changeset
4573 format %{ "[$addr]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4574 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4575 base(0xFFFFFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
4576 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4577 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4578 disp($addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
4579 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4580 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4581
a61af66fc99e Initial load
duke
parents:
diff changeset
4582 // Indirect Memory Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4583 operand indirect(eRegP reg) %{
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4584 constraint(ALLOC_IN_RC(int_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4585 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4586
a61af66fc99e Initial load
duke
parents:
diff changeset
4587 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4588 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4589 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4590 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4591 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4592 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4593 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4594 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4595
a61af66fc99e Initial load
duke
parents:
diff changeset
4596 // Indirect Memory Plus Short Offset Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4597 operand indOffset8(eRegP reg, immI8 off) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4598 match(AddP reg off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4599
a61af66fc99e Initial load
duke
parents:
diff changeset
4600 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4601 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4602 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4603 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4604 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4605 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4606 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4607 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4608
a61af66fc99e Initial load
duke
parents:
diff changeset
4609 // Indirect Memory Plus Long Offset Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4610 operand indOffset32(eRegP reg, immI off) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4611 match(AddP reg off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4612
a61af66fc99e Initial load
duke
parents:
diff changeset
4613 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4614 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4615 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4616 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4617 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4618 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4619 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4620 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4621
a61af66fc99e Initial load
duke
parents:
diff changeset
4622 // Indirect Memory Plus Long Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4623 operand indOffset32X(rRegI reg, immP off) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4624 match(AddP off reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4625
a61af66fc99e Initial load
duke
parents:
diff changeset
4626 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4627 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4628 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4629 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4630 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4631 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4632 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4633 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4634
a61af66fc99e Initial load
duke
parents:
diff changeset
4635 // Indirect Memory Plus Index Register Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4636 operand indIndexOffset(eRegP reg, rRegI ireg, immI off) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4637 match(AddP (AddP reg ireg) off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4638
a61af66fc99e Initial load
duke
parents:
diff changeset
4639 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
4640 format %{"[$reg + $off + $ireg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4641 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4642 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4643 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4644 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4645 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4646 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4647 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4648
a61af66fc99e Initial load
duke
parents:
diff changeset
4649 // Indirect Memory Plus Index Register Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4650 operand indIndex(eRegP reg, rRegI ireg) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4651 match(AddP reg ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4652
a61af66fc99e Initial load
duke
parents:
diff changeset
4653 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
4654 format %{"[$reg + $ireg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4655 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4656 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4657 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4658 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4659 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4660 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4661 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4662
a61af66fc99e Initial load
duke
parents:
diff changeset
4663 // // -------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4664 // // 486 architecture doesn't support "scale * index + offset" with out a base
a61af66fc99e Initial load
duke
parents:
diff changeset
4665 // // -------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4666 // // Scaled Memory Operands
a61af66fc99e Initial load
duke
parents:
diff changeset
4667 // // Indirect Memory Times Scale Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4668 // operand indScaleOffset(immP off, rRegI ireg, immI2 scale) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4669 // match(AddP off (LShiftI ireg scale));
a61af66fc99e Initial load
duke
parents:
diff changeset
4670 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4671 // op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
4672 // format %{"[$off + $ireg << $scale]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4673 // interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4674 // base(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4675 // index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4676 // scale($scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
4677 // disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4678 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4679 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4680
a61af66fc99e Initial load
duke
parents:
diff changeset
4681 // Indirect Memory Times Scale Plus Index Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4682 operand indIndexScale(eRegP reg, rRegI ireg, immI2 scale) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4683 match(AddP reg (LShiftI ireg scale));
a61af66fc99e Initial load
duke
parents:
diff changeset
4684
a61af66fc99e Initial load
duke
parents:
diff changeset
4685 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
4686 format %{"[$reg + $ireg << $scale]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4687 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4688 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4689 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4690 scale($scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
4691 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4692 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4693 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4694
a61af66fc99e Initial load
duke
parents:
diff changeset
4695 // Indirect Memory Times Scale Plus Index Register Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4696 operand indIndexScaleOffset(eRegP reg, immI off, rRegI ireg, immI2 scale) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4697 match(AddP (AddP reg (LShiftI ireg scale)) off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4698
a61af66fc99e Initial load
duke
parents:
diff changeset
4699 op_cost(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
4700 format %{"[$reg + $off + $ireg << $scale]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4701 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4702 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4703 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4704 scale($scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
4705 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4706 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4707 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4708
a61af66fc99e Initial load
duke
parents:
diff changeset
4709 //----------Load Long Memory Operands------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4710 // The load-long idiom will use it's address expression again after loading
a61af66fc99e Initial load
duke
parents:
diff changeset
4711 // the first word of the long. If the load-long destination overlaps with
a61af66fc99e Initial load
duke
parents:
diff changeset
4712 // registers used in the addressing expression, the 2nd half will be loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
4713 // from a clobbered address. Fix this by requiring that load-long use
a61af66fc99e Initial load
duke
parents:
diff changeset
4714 // address registers that do not overlap with the load-long target.
a61af66fc99e Initial load
duke
parents:
diff changeset
4715
a61af66fc99e Initial load
duke
parents:
diff changeset
4716 // load-long support
a61af66fc99e Initial load
duke
parents:
diff changeset
4717 operand load_long_RegP() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4718 constraint(ALLOC_IN_RC(esi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4719 match(RegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4720 match(eSIRegP);
a61af66fc99e Initial load
duke
parents:
diff changeset
4721 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4722 format %{ %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4723 interface(REG_INTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4724 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4725
a61af66fc99e Initial load
duke
parents:
diff changeset
4726 // Indirect Memory Operand Long
a61af66fc99e Initial load
duke
parents:
diff changeset
4727 operand load_long_indirect(load_long_RegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4728 constraint(ALLOC_IN_RC(esi_reg));
a61af66fc99e Initial load
duke
parents:
diff changeset
4729 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4730
a61af66fc99e Initial load
duke
parents:
diff changeset
4731 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4732 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4733 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4734 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4735 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4736 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4737 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4738 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4739
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 // Indirect Memory Plus Long Offset Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 operand load_long_indOffset32(load_long_RegP reg, immI off) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 match(AddP reg off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4743
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4746 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4747 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4748 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4749 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4750 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4751 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4752
a61af66fc99e Initial load
duke
parents:
diff changeset
4753 opclass load_long_memory(load_long_indirect, load_long_indOffset32);
a61af66fc99e Initial load
duke
parents:
diff changeset
4754
a61af66fc99e Initial load
duke
parents:
diff changeset
4755
a61af66fc99e Initial load
duke
parents:
diff changeset
4756 //----------Special Memory Operands--------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4757 // Stack Slot Operand - This operand is used for loading and storing temporary
a61af66fc99e Initial load
duke
parents:
diff changeset
4758 // values on the stack where a match requires a value to
a61af66fc99e Initial load
duke
parents:
diff changeset
4759 // flow through memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
4760 operand stackSlotP(sRegP reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4761 constraint(ALLOC_IN_RC(stack_slots));
a61af66fc99e Initial load
duke
parents:
diff changeset
4762 // No match rule because this operand is only generated in matching
a61af66fc99e Initial load
duke
parents:
diff changeset
4763 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4764 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4765 base(0x4); // ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
4766 index(0x4); // No Index
a61af66fc99e Initial load
duke
parents:
diff changeset
4767 scale(0x0); // No Scale
a61af66fc99e Initial load
duke
parents:
diff changeset
4768 disp($reg); // Stack Offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4769 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4770 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4771
a61af66fc99e Initial load
duke
parents:
diff changeset
4772 operand stackSlotI(sRegI reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4773 constraint(ALLOC_IN_RC(stack_slots));
a61af66fc99e Initial load
duke
parents:
diff changeset
4774 // No match rule because this operand is only generated in matching
a61af66fc99e Initial load
duke
parents:
diff changeset
4775 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4776 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4777 base(0x4); // ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
4778 index(0x4); // No Index
a61af66fc99e Initial load
duke
parents:
diff changeset
4779 scale(0x0); // No Scale
a61af66fc99e Initial load
duke
parents:
diff changeset
4780 disp($reg); // Stack Offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4781 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4782 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4783
a61af66fc99e Initial load
duke
parents:
diff changeset
4784 operand stackSlotF(sRegF reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4785 constraint(ALLOC_IN_RC(stack_slots));
a61af66fc99e Initial load
duke
parents:
diff changeset
4786 // No match rule because this operand is only generated in matching
a61af66fc99e Initial load
duke
parents:
diff changeset
4787 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4788 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4789 base(0x4); // ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
4790 index(0x4); // No Index
a61af66fc99e Initial load
duke
parents:
diff changeset
4791 scale(0x0); // No Scale
a61af66fc99e Initial load
duke
parents:
diff changeset
4792 disp($reg); // Stack Offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4793 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4794 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4795
a61af66fc99e Initial load
duke
parents:
diff changeset
4796 operand stackSlotD(sRegD reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4797 constraint(ALLOC_IN_RC(stack_slots));
a61af66fc99e Initial load
duke
parents:
diff changeset
4798 // No match rule because this operand is only generated in matching
a61af66fc99e Initial load
duke
parents:
diff changeset
4799 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4800 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4801 base(0x4); // ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
4802 index(0x4); // No Index
a61af66fc99e Initial load
duke
parents:
diff changeset
4803 scale(0x0); // No Scale
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 disp($reg); // Stack Offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4805 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4806 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4807
a61af66fc99e Initial load
duke
parents:
diff changeset
4808 operand stackSlotL(sRegL reg) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 constraint(ALLOC_IN_RC(stack_slots));
a61af66fc99e Initial load
duke
parents:
diff changeset
4810 // No match rule because this operand is only generated in matching
a61af66fc99e Initial load
duke
parents:
diff changeset
4811 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4812 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4813 base(0x4); // ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
4814 index(0x4); // No Index
a61af66fc99e Initial load
duke
parents:
diff changeset
4815 scale(0x0); // No Scale
a61af66fc99e Initial load
duke
parents:
diff changeset
4816 disp($reg); // Stack Offset
a61af66fc99e Initial load
duke
parents:
diff changeset
4817 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4818 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4819
a61af66fc99e Initial load
duke
parents:
diff changeset
4820 //----------Memory Operands - Win95 Implicit Null Variants----------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4821 // Indirect Memory Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4822 operand indirect_win95_safe(eRegP_no_EBP reg)
a61af66fc99e Initial load
duke
parents:
diff changeset
4823 %{
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4824 constraint(ALLOC_IN_RC(int_reg));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4825 match(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4826
a61af66fc99e Initial load
duke
parents:
diff changeset
4827 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4828 format %{ "[$reg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4829 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4830 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4831 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4832 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4833 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4834 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4835 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4836
a61af66fc99e Initial load
duke
parents:
diff changeset
4837 // Indirect Memory Plus Short Offset Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4838 operand indOffset8_win95_safe(eRegP_no_EBP reg, immI8 off)
a61af66fc99e Initial load
duke
parents:
diff changeset
4839 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4840 match(AddP reg off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4841
a61af66fc99e Initial load
duke
parents:
diff changeset
4842 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4843 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4844 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4845 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4846 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4847 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4848 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4849 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4850 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4851
a61af66fc99e Initial load
duke
parents:
diff changeset
4852 // Indirect Memory Plus Long Offset Operand
a61af66fc99e Initial load
duke
parents:
diff changeset
4853 operand indOffset32_win95_safe(eRegP_no_EBP reg, immI off)
a61af66fc99e Initial load
duke
parents:
diff changeset
4854 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4855 match(AddP reg off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4856
a61af66fc99e Initial load
duke
parents:
diff changeset
4857 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4858 format %{ "[$reg + $off]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4859 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4860 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4861 index(0x4);
a61af66fc99e Initial load
duke
parents:
diff changeset
4862 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4863 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4864 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4865 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4866
a61af66fc99e Initial load
duke
parents:
diff changeset
4867 // Indirect Memory Plus Index Register Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4868 operand indIndexOffset_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI off)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4869 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4870 match(AddP (AddP reg ireg) off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4871
a61af66fc99e Initial load
duke
parents:
diff changeset
4872 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4873 format %{"[$reg + $off + $ireg]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4874 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4875 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4876 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4877 scale(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4878 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4879 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4880 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4881
a61af66fc99e Initial load
duke
parents:
diff changeset
4882 // Indirect Memory Times Scale Plus Index Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4883 operand indIndexScale_win95_safe(eRegP_no_EBP reg, rRegI ireg, immI2 scale)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4884 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4885 match(AddP reg (LShiftI ireg scale));
a61af66fc99e Initial load
duke
parents:
diff changeset
4886
a61af66fc99e Initial load
duke
parents:
diff changeset
4887 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4888 format %{"[$reg + $ireg << $scale]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4890 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4891 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 scale($scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 disp(0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4894 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4896
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 // Indirect Memory Times Scale Plus Index Register Plus Offset Operand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
4898 operand indIndexScaleOffset_win95_safe(eRegP_no_EBP reg, immI off, rRegI ireg, immI2 scale)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4899 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 match(AddP (AddP reg (LShiftI ireg scale)) off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4901
a61af66fc99e Initial load
duke
parents:
diff changeset
4902 op_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
4903 format %{"[$reg + $off + $ireg << $scale]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4904 interface(MEMORY_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4905 base($reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4906 index($ireg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4907 scale($scale);
a61af66fc99e Initial load
duke
parents:
diff changeset
4908 disp($off);
a61af66fc99e Initial load
duke
parents:
diff changeset
4909 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4910 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4911
a61af66fc99e Initial load
duke
parents:
diff changeset
4912 //----------Conditional Branch Operands----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
4913 // Comparison Op - This is the operation of the comparison, and is limited to
a61af66fc99e Initial load
duke
parents:
diff changeset
4914 // the following set of codes:
a61af66fc99e Initial load
duke
parents:
diff changeset
4915 // L (<), LE (<=), G (>), GE (>=), E (==), NE (!=)
a61af66fc99e Initial load
duke
parents:
diff changeset
4916 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4917 // Other attributes of the comparison, such as unsignedness, are specified
a61af66fc99e Initial load
duke
parents:
diff changeset
4918 // by the comparison instruction that sets a condition code flags register.
a61af66fc99e Initial load
duke
parents:
diff changeset
4919 // That result is represented by a flags operand whose subtype is appropriate
a61af66fc99e Initial load
duke
parents:
diff changeset
4920 // to the unsignedness (etc.) of the comparison.
a61af66fc99e Initial load
duke
parents:
diff changeset
4921 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4922 // Later, the instruction which matches both the Comparison Op (a Bool) and
a61af66fc99e Initial load
duke
parents:
diff changeset
4923 // the flags (produced by the Cmp) specifies the coding of the comparison op
a61af66fc99e Initial load
duke
parents:
diff changeset
4924 // by matching a specific subtype of Bool operand below, such as cmpOpU.
a61af66fc99e Initial load
duke
parents:
diff changeset
4925
a61af66fc99e Initial load
duke
parents:
diff changeset
4926 // Comparision Code
a61af66fc99e Initial load
duke
parents:
diff changeset
4927 operand cmpOp() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4928 match(Bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
4929
a61af66fc99e Initial load
duke
parents:
diff changeset
4930 format %{ "" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4931 interface(COND_INTER) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4932 equal(0x4, "e");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4933 not_equal(0x5, "ne");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4934 less(0xC, "l");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4935 greater_equal(0xD, "ge");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4936 less_equal(0xE, "le");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4937 greater(0xF, "g");
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4938 overflow(0x0, "o");
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4939 no_overflow(0x1, "no");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4940 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4941 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4942
a61af66fc99e Initial load
duke
parents:
diff changeset
4943 // Comparison Code, unsigned compare. Used by FP also, with
a61af66fc99e Initial load
duke
parents:
diff changeset
4944 // C2 (unordered) turned into GT or LT already. The other bits
a61af66fc99e Initial load
duke
parents:
diff changeset
4945 // C0 and C3 are turned into Carry & Zero flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
4946 operand cmpOpU() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
4947 match(Bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
4948
a61af66fc99e Initial load
duke
parents:
diff changeset
4949 format %{ "" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4950 interface(COND_INTER) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4951 equal(0x4, "e");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4952 not_equal(0x5, "ne");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4953 less(0x2, "b");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4954 greater_equal(0x3, "nb");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4955 less_equal(0x6, "be");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4956 greater(0x7, "nbe");
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4957 overflow(0x0, "o");
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4958 no_overflow(0x1, "no");
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4959 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4960 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4961
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4962 // Floating comparisons that don't require any fixup for the unordered case
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4963 operand cmpOpUCF() %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4964 match(Bool);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4965 predicate(n->as_Bool()->_test._test == BoolTest::lt ||
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4966 n->as_Bool()->_test._test == BoolTest::ge ||
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4967 n->as_Bool()->_test._test == BoolTest::le ||
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4968 n->as_Bool()->_test._test == BoolTest::gt);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4969 format %{ "" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4970 interface(COND_INTER) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4971 equal(0x4, "e");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4972 not_equal(0x5, "ne");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4973 less(0x2, "b");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4974 greater_equal(0x3, "nb");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4975 less_equal(0x6, "be");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4976 greater(0x7, "nbe");
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4977 overflow(0x0, "o");
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4978 no_overflow(0x1, "no");
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4979 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4980 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4981
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4982
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4983 // Floating comparisons that can be fixed up with extra conditional jumps
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4984 operand cmpOpUCF2() %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4985 match(Bool);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4986 predicate(n->as_Bool()->_test._test == BoolTest::ne ||
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4987 n->as_Bool()->_test._test == BoolTest::eq);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4988 format %{ "" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4989 interface(COND_INTER) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4990 equal(0x4, "e");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4991 not_equal(0x5, "ne");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4992 less(0x2, "b");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4993 greater_equal(0x3, "nb");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4994 less_equal(0x6, "be");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
4995 greater(0x7, "nbe");
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4996 overflow(0x0, "o");
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
4997 no_overflow(0x1, "no");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4998 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
4999 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5000
a61af66fc99e Initial load
duke
parents:
diff changeset
5001 // Comparison Code for FP conditional move
a61af66fc99e Initial load
duke
parents:
diff changeset
5002 operand cmpOp_fcmov() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5003 match(Bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
5004
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5005 predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5006 n->as_Bool()->_test._test != BoolTest::no_overflow);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5007 format %{ "" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5008 interface(COND_INTER) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5009 equal (0x0C8);
a61af66fc99e Initial load
duke
parents:
diff changeset
5010 not_equal (0x1C8);
a61af66fc99e Initial load
duke
parents:
diff changeset
5011 less (0x0C0);
a61af66fc99e Initial load
duke
parents:
diff changeset
5012 greater_equal(0x1C0);
a61af66fc99e Initial load
duke
parents:
diff changeset
5013 less_equal (0x0D0);
a61af66fc99e Initial load
duke
parents:
diff changeset
5014 greater (0x1D0);
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5015 overflow(0x0, "o"); // not really supported by the instruction
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5016 no_overflow(0x1, "no"); // not really supported by the instruction
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5017 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5018 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5019
a61af66fc99e Initial load
duke
parents:
diff changeset
5020 // Comparision Code used in long compares
a61af66fc99e Initial load
duke
parents:
diff changeset
5021 operand cmpOp_commute() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5022 match(Bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
5023
a61af66fc99e Initial load
duke
parents:
diff changeset
5024 format %{ "" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5025 interface(COND_INTER) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5026 equal(0x4, "e");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5027 not_equal(0x5, "ne");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5028 less(0xF, "g");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5029 greater_equal(0xE, "le");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5030 less_equal(0xD, "ge");
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
5031 greater(0xC, "l");
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5032 overflow(0x0, "o");
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
5033 no_overflow(0x1, "no");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5034 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5035 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5036
a61af66fc99e Initial load
duke
parents:
diff changeset
5037 //----------OPERAND CLASSES----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5038 // Operand Classes are groups of operands that are used as to simplify
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
5039 // instruction definitions by not requiring the AD writer to specify separate
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5040 // instructions for every form of operand when the instruction accepts
a61af66fc99e Initial load
duke
parents:
diff changeset
5041 // multiple operand types with the same basic encoding and format. The classic
a61af66fc99e Initial load
duke
parents:
diff changeset
5042 // case of this is memory operands.
a61af66fc99e Initial load
duke
parents:
diff changeset
5043
a61af66fc99e Initial load
duke
parents:
diff changeset
5044 opclass memory(direct, indirect, indOffset8, indOffset32, indOffset32X, indIndexOffset,
a61af66fc99e Initial load
duke
parents:
diff changeset
5045 indIndex, indIndexScale, indIndexScaleOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
5046
a61af66fc99e Initial load
duke
parents:
diff changeset
5047 // Long memory operations are encoded in 2 instructions and a +4 offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
5048 // This means some kind of offset is always required and you cannot use
a61af66fc99e Initial load
duke
parents:
diff changeset
5049 // an oop as the offset (done when working on static globals).
a61af66fc99e Initial load
duke
parents:
diff changeset
5050 opclass long_memory(direct, indirect, indOffset8, indOffset32, indIndexOffset,
a61af66fc99e Initial load
duke
parents:
diff changeset
5051 indIndex, indIndexScale, indIndexScaleOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
5052
a61af66fc99e Initial load
duke
parents:
diff changeset
5053
a61af66fc99e Initial load
duke
parents:
diff changeset
5054 //----------PIPELINE-----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5055 // Rules which define the behavior of the target architectures pipeline.
a61af66fc99e Initial load
duke
parents:
diff changeset
5056 pipeline %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5057
a61af66fc99e Initial load
duke
parents:
diff changeset
5058 //----------ATTRIBUTES---------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5059 attributes %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5060 variable_size_instructions; // Fixed size instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
5061 max_instructions_per_bundle = 3; // Up to 3 instructions per bundle
a61af66fc99e Initial load
duke
parents:
diff changeset
5062 instruction_unit_size = 1; // An instruction is 1 bytes long
a61af66fc99e Initial load
duke
parents:
diff changeset
5063 instruction_fetch_unit_size = 16; // The processor fetches one line
a61af66fc99e Initial load
duke
parents:
diff changeset
5064 instruction_fetch_units = 1; // of 16 bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
5065
a61af66fc99e Initial load
duke
parents:
diff changeset
5066 // List of nop instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
5067 nops( MachNop );
a61af66fc99e Initial load
duke
parents:
diff changeset
5068 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5069
a61af66fc99e Initial load
duke
parents:
diff changeset
5070 //----------RESOURCES----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5071 // Resources are the functional units available to the machine
a61af66fc99e Initial load
duke
parents:
diff changeset
5072
a61af66fc99e Initial load
duke
parents:
diff changeset
5073 // Generic P2/P3 pipeline
a61af66fc99e Initial load
duke
parents:
diff changeset
5074 // 3 decoders, only D0 handles big operands; a "bundle" is the limit of
a61af66fc99e Initial load
duke
parents:
diff changeset
5075 // 3 instructions decoded per cycle.
a61af66fc99e Initial load
duke
parents:
diff changeset
5076 // 2 load/store ops per cycle, 1 branch, 1 FPU,
a61af66fc99e Initial load
duke
parents:
diff changeset
5077 // 2 ALU op, only ALU0 handles mul/div instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
5078 resources( D0, D1, D2, DECODE = D0 | D1 | D2,
a61af66fc99e Initial load
duke
parents:
diff changeset
5079 MS0, MS1, MEM = MS0 | MS1,
a61af66fc99e Initial load
duke
parents:
diff changeset
5080 BR, FPU,
a61af66fc99e Initial load
duke
parents:
diff changeset
5081 ALU0, ALU1, ALU = ALU0 | ALU1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
5082
a61af66fc99e Initial load
duke
parents:
diff changeset
5083 //----------PIPELINE DESCRIPTION-----------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5084 // Pipeline Description specifies the stages in the machine's pipeline
a61af66fc99e Initial load
duke
parents:
diff changeset
5085
a61af66fc99e Initial load
duke
parents:
diff changeset
5086 // Generic P2/P3 pipeline
a61af66fc99e Initial load
duke
parents:
diff changeset
5087 pipe_desc(S0, S1, S2, S3, S4, S5);
a61af66fc99e Initial load
duke
parents:
diff changeset
5088
a61af66fc99e Initial load
duke
parents:
diff changeset
5089 //----------PIPELINE CLASSES---------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5090 // Pipeline Classes describe the stages in which input and output are
a61af66fc99e Initial load
duke
parents:
diff changeset
5091 // referenced by the hardware pipeline.
a61af66fc99e Initial load
duke
parents:
diff changeset
5092
a61af66fc99e Initial load
duke
parents:
diff changeset
5093 // Naming convention: ialu or fpu
a61af66fc99e Initial load
duke
parents:
diff changeset
5094 // Then: _reg
a61af66fc99e Initial load
duke
parents:
diff changeset
5095 // Then: _reg if there is a 2nd register
a61af66fc99e Initial load
duke
parents:
diff changeset
5096 // Then: _long if it's a pair of instructions implementing a long
a61af66fc99e Initial load
duke
parents:
diff changeset
5097 // Then: _fat if it requires the big decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5098 // Or: _mem if it requires the big decoder and a memory unit.
a61af66fc99e Initial load
duke
parents:
diff changeset
5099
a61af66fc99e Initial load
duke
parents:
diff changeset
5100 // Integer ALU reg operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5101 pipe_class ialu_reg(rRegI dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5102 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5103 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5104 dst : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5105 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5106 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5107 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5108
a61af66fc99e Initial load
duke
parents:
diff changeset
5109 // Long ALU reg operation
a61af66fc99e Initial load
duke
parents:
diff changeset
5110 pipe_class ialu_reg_long(eRegL dst) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5111 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5112 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5113 dst : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5114 DECODE : S0(2); // any 2 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5115 ALU : S3(2); // both alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5116 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5117
a61af66fc99e Initial load
duke
parents:
diff changeset
5118 // Integer ALU reg operation using big decoder
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5119 pipe_class ialu_reg_fat(rRegI dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5120 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5121 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5122 dst : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5123 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5124 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5125 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5126
a61af66fc99e Initial load
duke
parents:
diff changeset
5127 // Long ALU reg operation using big decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5128 pipe_class ialu_reg_long_fat(eRegL dst) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5129 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5130 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5131 dst : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5132 D0 : S0(2); // big decoder only; twice
a61af66fc99e Initial load
duke
parents:
diff changeset
5133 ALU : S3(2); // any 2 alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5134 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5135
a61af66fc99e Initial load
duke
parents:
diff changeset
5136 // Integer ALU reg-reg operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5137 pipe_class ialu_reg_reg(rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5138 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5139 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5140 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5141 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5142 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5143 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5144
a61af66fc99e Initial load
duke
parents:
diff changeset
5145 // Long ALU reg-reg operation
a61af66fc99e Initial load
duke
parents:
diff changeset
5146 pipe_class ialu_reg_reg_long(eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5147 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5148 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5149 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5150 DECODE : S0(2); // any 2 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5151 ALU : S3(2); // both alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5152 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5153
a61af66fc99e Initial load
duke
parents:
diff changeset
5154 // Integer ALU reg-reg operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5155 pipe_class ialu_reg_reg_fat(rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5156 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5157 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5158 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5159 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5160 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5161 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5162
a61af66fc99e Initial load
duke
parents:
diff changeset
5163 // Long ALU reg-reg operation
a61af66fc99e Initial load
duke
parents:
diff changeset
5164 pipe_class ialu_reg_reg_long_fat(eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5165 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5166 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5167 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5168 D0 : S0(2); // big decoder only; twice
a61af66fc99e Initial load
duke
parents:
diff changeset
5169 ALU : S3(2); // both alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5170 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5171
a61af66fc99e Initial load
duke
parents:
diff changeset
5172 // Integer ALU reg-mem operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5173 pipe_class ialu_reg_mem(rRegI dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5174 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5175 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5176 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5177 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5178 ALU : S4; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5179 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5180 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5181
a61af66fc99e Initial load
duke
parents:
diff changeset
5182 // Long ALU reg-mem operation
a61af66fc99e Initial load
duke
parents:
diff changeset
5183 pipe_class ialu_reg_long_mem(eRegL dst, load_long_memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5184 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5185 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5186 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5187 D0 : S0(2); // big decoder only; twice
a61af66fc99e Initial load
duke
parents:
diff changeset
5188 ALU : S4(2); // any 2 alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5189 MEM : S3(2); // both mems
a61af66fc99e Initial load
duke
parents:
diff changeset
5190 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5191
a61af66fc99e Initial load
duke
parents:
diff changeset
5192 // Integer mem operation (prefetch)
a61af66fc99e Initial load
duke
parents:
diff changeset
5193 pipe_class ialu_mem(memory mem)
a61af66fc99e Initial load
duke
parents:
diff changeset
5194 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5195 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5196 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5197 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5198 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5199 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5200
a61af66fc99e Initial load
duke
parents:
diff changeset
5201 // Integer Store to Memory
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5202 pipe_class ialu_mem_reg(memory mem, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5203 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5204 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5205 src : S5(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5206 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5207 ALU : S4; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5208 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5209 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5210
a61af66fc99e Initial load
duke
parents:
diff changeset
5211 // Long Store to Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
5212 pipe_class ialu_mem_long_reg(memory mem, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5213 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5214 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5215 src : S5(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5216 D0 : S0(2); // big decoder only; twice
a61af66fc99e Initial load
duke
parents:
diff changeset
5217 ALU : S4(2); // any 2 alus
a61af66fc99e Initial load
duke
parents:
diff changeset
5218 MEM : S3(2); // Both mems
a61af66fc99e Initial load
duke
parents:
diff changeset
5219 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5220
a61af66fc99e Initial load
duke
parents:
diff changeset
5221 // Integer Store to Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
5222 pipe_class ialu_mem_imm(memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5223 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5224 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5225 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5226 ALU : S4; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5227 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5228 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5229
a61af66fc99e Initial load
duke
parents:
diff changeset
5230 // Integer ALU0 reg-reg operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5231 pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5232 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5233 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5234 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5235 D0 : S0; // Big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5236 ALU0 : S3; // only alu0
a61af66fc99e Initial load
duke
parents:
diff changeset
5237 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5238
a61af66fc99e Initial load
duke
parents:
diff changeset
5239 // Integer ALU0 reg-mem operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5240 pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5241 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5242 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5243 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5244 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5245 ALU0 : S4; // ALU0 only
a61af66fc99e Initial load
duke
parents:
diff changeset
5246 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5247 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5248
a61af66fc99e Initial load
duke
parents:
diff changeset
5249 // Integer ALU reg-reg operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5250 pipe_class ialu_cr_reg_reg(eFlagsReg cr, rRegI src1, rRegI src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5251 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5252 cr : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5253 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5254 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5255 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5256 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5257 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5258
a61af66fc99e Initial load
duke
parents:
diff changeset
5259 // Integer ALU reg-imm operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5260 pipe_class ialu_cr_reg_imm(eFlagsReg cr, rRegI src1) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5261 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5262 cr : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5263 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5264 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5265 ALU : S3; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5266 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5267
a61af66fc99e Initial load
duke
parents:
diff changeset
5268 // Integer ALU reg-mem operation
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5269 pipe_class ialu_cr_reg_mem(eFlagsReg cr, rRegI src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5270 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5271 cr : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5272 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5273 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5274 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5275 ALU : S4; // any alu
a61af66fc99e Initial load
duke
parents:
diff changeset
5276 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5277 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5278
a61af66fc99e Initial load
duke
parents:
diff changeset
5279 // Conditional move reg-reg
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5280 pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5281 instruction_count(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
5282 y : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5283 q : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5284 p : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5285 DECODE : S0(4); // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5286 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5287
a61af66fc99e Initial load
duke
parents:
diff changeset
5288 // Conditional move reg-reg
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5289 pipe_class pipe_cmov_reg( rRegI dst, rRegI src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5290 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5291 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5292 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5293 cr : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5294 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5295 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5296
a61af66fc99e Initial load
duke
parents:
diff changeset
5297 // Conditional move reg-mem
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5298 pipe_class pipe_cmov_mem( eFlagsReg cr, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5299 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5300 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5301 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5302 cr : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5303 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5304 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5305 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5306
a61af66fc99e Initial load
duke
parents:
diff changeset
5307 // Conditional move reg-reg long
a61af66fc99e Initial load
duke
parents:
diff changeset
5308 pipe_class pipe_cmov_reg_long( eFlagsReg cr, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5309 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5310 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5311 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5312 cr : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5313 DECODE : S0(2); // any 2 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5314 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5315
a61af66fc99e Initial load
duke
parents:
diff changeset
5316 // Conditional move double reg-reg
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5317 pipe_class pipe_cmovDPR_reg( eFlagsReg cr, regDPR1 dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5318 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5319 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5320 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5321 cr : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5322 DECODE : S0; // any decoder
a61af66fc99e Initial load
duke
parents:
diff changeset
5323 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5324
a61af66fc99e Initial load
duke
parents:
diff changeset
5325 // Float reg-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5326 pipe_class fpu_reg(regDPR dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5327 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5328 dst : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5329 DECODE : S0(2); // any 2 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5330 FPU : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5331 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5332
a61af66fc99e Initial load
duke
parents:
diff changeset
5333 // Float reg-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5334 pipe_class fpu_reg_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5335 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5336 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5337 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5338 DECODE : S0(2); // any 2 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5339 FPU : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5340 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5341
a61af66fc99e Initial load
duke
parents:
diff changeset
5342 // Float reg-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5343 pipe_class fpu_reg_reg_reg(regDPR dst, regDPR src1, regDPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5344 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5345 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5346 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5347 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5348 DECODE : S0(3); // any 3 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5349 FPU : S3(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5350 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5351
a61af66fc99e Initial load
duke
parents:
diff changeset
5352 // Float reg-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5353 pipe_class fpu_reg_reg_reg_reg(regDPR dst, regDPR src1, regDPR src2, regDPR src3) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5354 instruction_count(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
5355 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5356 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5357 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5358 src3 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5359 DECODE : S0(4); // any 3 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5360 FPU : S3(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5361 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5362
a61af66fc99e Initial load
duke
parents:
diff changeset
5363 // Float reg-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5364 pipe_class fpu_reg_mem_reg_reg(regDPR dst, memory src1, regDPR src2, regDPR src3) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5365 instruction_count(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
5366 dst : S4(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5367 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5368 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5369 src3 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5370 DECODE : S1(3); // any 3 decoders
a61af66fc99e Initial load
duke
parents:
diff changeset
5371 D0 : S0; // Big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5372 FPU : S3(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5373 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5374 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5375
a61af66fc99e Initial load
duke
parents:
diff changeset
5376 // Float reg-mem operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5377 pipe_class fpu_reg_mem(regDPR dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5378 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5379 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5380 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5381 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5382 DECODE : S1; // any decoder for FPU POP
a61af66fc99e Initial load
duke
parents:
diff changeset
5383 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5384 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5385 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5386
a61af66fc99e Initial load
duke
parents:
diff changeset
5387 // Float reg-mem operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5388 pipe_class fpu_reg_reg_mem(regDPR dst, regDPR src1, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5389 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5390 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5391 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5392 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5393 D0 : S0; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5394 DECODE : S1(2); // any decoder for FPU POP
a61af66fc99e Initial load
duke
parents:
diff changeset
5395 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5396 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5397 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5398
a61af66fc99e Initial load
duke
parents:
diff changeset
5399 // Float mem-reg operation
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5400 pipe_class fpu_mem_reg(memory mem, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5401 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5402 src : S5(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5403 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5404 DECODE : S0; // any decoder for FPU PUSH
a61af66fc99e Initial load
duke
parents:
diff changeset
5405 D0 : S1; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5406 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5407 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5408 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5409
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5410 pipe_class fpu_mem_reg_reg(memory mem, regDPR src1, regDPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5411 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5412 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5413 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5414 mem : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5415 DECODE : S0(2); // any decoder for FPU PUSH
a61af66fc99e Initial load
duke
parents:
diff changeset
5416 D0 : S1; // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5417 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5418 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5419 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5420
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5421 pipe_class fpu_mem_reg_mem(memory mem, regDPR src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5422 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5423 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5424 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5425 mem : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5426 DECODE : S0; // any decoder for FPU PUSH
a61af66fc99e Initial load
duke
parents:
diff changeset
5427 D0 : S0(2); // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5428 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5429 MEM : S3(2); // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5430 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5431
a61af66fc99e Initial load
duke
parents:
diff changeset
5432 pipe_class fpu_mem_mem(memory dst, memory src1) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5433 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5434 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5435 dst : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5436 D0 : S0(2); // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5437 MEM : S3(2); // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5438 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5439
a61af66fc99e Initial load
duke
parents:
diff changeset
5440 pipe_class fpu_mem_mem_mem(memory dst, memory src1, memory src2) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5441 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5442 src1 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5443 src2 : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5444 dst : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5445 D0 : S0(3); // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5446 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5447 MEM : S3(3); // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5448 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5449
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5450 pipe_class fpu_mem_reg_con(memory mem, regDPR src1) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5451 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5452 src1 : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5453 mem : S4(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5454 DECODE : S0; // any decoder for FPU PUSH
a61af66fc99e Initial load
duke
parents:
diff changeset
5455 D0 : S0(2); // big decoder only
a61af66fc99e Initial load
duke
parents:
diff changeset
5456 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5457 MEM : S3(2); // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5458 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5459
a61af66fc99e Initial load
duke
parents:
diff changeset
5460 // Float load constant
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5461 pipe_class fpu_reg_con(regDPR dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5462 instruction_count(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5463 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5464 D0 : S0; // big decoder only for the load
a61af66fc99e Initial load
duke
parents:
diff changeset
5465 DECODE : S1; // any decoder for FPU POP
a61af66fc99e Initial load
duke
parents:
diff changeset
5466 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5467 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5468 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5469
a61af66fc99e Initial load
duke
parents:
diff changeset
5470 // Float load constant
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
5471 pipe_class fpu_reg_reg_con(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5472 instruction_count(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5473 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5474 src : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5475 D0 : S0; // big decoder only for the load
a61af66fc99e Initial load
duke
parents:
diff changeset
5476 DECODE : S1(2); // any decoder for FPU POP
a61af66fc99e Initial load
duke
parents:
diff changeset
5477 FPU : S4;
a61af66fc99e Initial load
duke
parents:
diff changeset
5478 MEM : S3; // any mem
a61af66fc99e Initial load
duke
parents:
diff changeset
5479 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5480
a61af66fc99e Initial load
duke
parents:
diff changeset
5481 // UnConditional branch
a61af66fc99e Initial load
duke
parents:
diff changeset
5482 pipe_class pipe_jmp( label labl ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5483 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5484 BR : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5485 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5486
a61af66fc99e Initial load
duke
parents:
diff changeset
5487 // Conditional branch
a61af66fc99e Initial load
duke
parents:
diff changeset
5488 pipe_class pipe_jcc( cmpOp cmp, eFlagsReg cr, label labl ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5489 single_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
5490 cr : S1(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5491 BR : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5492 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5493
a61af66fc99e Initial load
duke
parents:
diff changeset
5494 // Allocation idiom
a61af66fc99e Initial load
duke
parents:
diff changeset
5495 pipe_class pipe_cmpxchg( eRegP dst, eRegP heap_ptr ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5496 instruction_count(1); force_serialization;
a61af66fc99e Initial load
duke
parents:
diff changeset
5497 fixed_latency(6);
a61af66fc99e Initial load
duke
parents:
diff changeset
5498 heap_ptr : S3(read);
a61af66fc99e Initial load
duke
parents:
diff changeset
5499 DECODE : S0(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
5500 D0 : S2;
a61af66fc99e Initial load
duke
parents:
diff changeset
5501 MEM : S3;
a61af66fc99e Initial load
duke
parents:
diff changeset
5502 ALU : S3(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5503 dst : S5(write);
a61af66fc99e Initial load
duke
parents:
diff changeset
5504 BR : S5;
a61af66fc99e Initial load
duke
parents:
diff changeset
5505 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5506
a61af66fc99e Initial load
duke
parents:
diff changeset
5507 // Generic big/slow expanded idiom
a61af66fc99e Initial load
duke
parents:
diff changeset
5508 pipe_class pipe_slow( ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5509 instruction_count(10); multiple_bundles; force_serialization;
a61af66fc99e Initial load
duke
parents:
diff changeset
5510 fixed_latency(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
5511 D0 : S0(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5512 MEM : S3(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
5513 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5514
a61af66fc99e Initial load
duke
parents:
diff changeset
5515 // The real do-nothing guy
a61af66fc99e Initial load
duke
parents:
diff changeset
5516 pipe_class empty( ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5517 instruction_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
5518 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5519
a61af66fc99e Initial load
duke
parents:
diff changeset
5520 // Define the class for the Nop node
a61af66fc99e Initial load
duke
parents:
diff changeset
5521 define %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5522 MachNop = empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
5523 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5524
a61af66fc99e Initial load
duke
parents:
diff changeset
5525 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5526
a61af66fc99e Initial load
duke
parents:
diff changeset
5527 //----------INSTRUCTIONS-------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5528 //
a61af66fc99e Initial load
duke
parents:
diff changeset
5529 // match -- States which machine-independent subtree may be replaced
a61af66fc99e Initial load
duke
parents:
diff changeset
5530 // by this instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
5531 // ins_cost -- The estimated cost of this instruction is used by instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
5532 // selection to identify a minimum cost tree of machine
a61af66fc99e Initial load
duke
parents:
diff changeset
5533 // instructions that matches a tree of machine-independent
a61af66fc99e Initial load
duke
parents:
diff changeset
5534 // instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
5535 // format -- A string providing the disassembly for this instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
5536 // The value of an instruction's operand may be inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
5537 // by referring to it with a '$' prefix.
a61af66fc99e Initial load
duke
parents:
diff changeset
5538 // opcode -- Three instruction opcodes may be provided. These are referred
a61af66fc99e Initial load
duke
parents:
diff changeset
5539 // to within an encode class as $primary, $secondary, and $tertiary
a61af66fc99e Initial load
duke
parents:
diff changeset
5540 // respectively. The primary opcode is commonly used to
a61af66fc99e Initial load
duke
parents:
diff changeset
5541 // indicate the type of machine instruction, while secondary
a61af66fc99e Initial load
duke
parents:
diff changeset
5542 // and tertiary are often used for prefix options or addressing
a61af66fc99e Initial load
duke
parents:
diff changeset
5543 // modes.
a61af66fc99e Initial load
duke
parents:
diff changeset
5544 // ins_encode -- A list of encode classes with parameters. The encode class
a61af66fc99e Initial load
duke
parents:
diff changeset
5545 // name must have been defined in an 'enc_class' specification
a61af66fc99e Initial load
duke
parents:
diff changeset
5546 // in the encode section of the architecture description.
a61af66fc99e Initial load
duke
parents:
diff changeset
5547
a61af66fc99e Initial load
duke
parents:
diff changeset
5548 //----------BSWAP-Instruction--------------------------------------------------
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5549 instruct bytes_reverse_int(rRegI dst) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5550 match(Set dst (ReverseBytesI dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
5551
a61af66fc99e Initial load
duke
parents:
diff changeset
5552 format %{ "BSWAP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5553 opcode(0x0F, 0xC8);
a61af66fc99e Initial load
duke
parents:
diff changeset
5554 ins_encode( OpcP, OpcSReg(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
5555 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
5556 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5557
a61af66fc99e Initial load
duke
parents:
diff changeset
5558 instruct bytes_reverse_long(eRegL dst) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5559 match(Set dst (ReverseBytesL dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
5560
a61af66fc99e Initial load
duke
parents:
diff changeset
5561 format %{ "BSWAP $dst.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
5562 "BSWAP $dst.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
5563 "XCHG $dst.lo $dst.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5564
a61af66fc99e Initial load
duke
parents:
diff changeset
5565 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
5566 ins_encode( bswap_long_bytes(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
5567 ins_pipe( ialu_reg_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
5568 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5569
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5570 instruct bytes_reverse_unsigned_short(rRegI dst, eFlagsReg cr) %{
1396
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5571 match(Set dst (ReverseBytesUS dst));
6138
ccaa67adfe5b 7063674: Wrong results from basic comparisons after calls to Long.bitCount(long)
twisti
parents: 6084
diff changeset
5572 effect(KILL cr);
1396
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5573
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5574 format %{ "BSWAP $dst\n\t"
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5575 "SHR $dst,16\n\t" %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5576 ins_encode %{
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5577 __ bswapl($dst$$Register);
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5578 __ shrl($dst$$Register, 16);
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5579 %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5580 ins_pipe( ialu_reg );
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5581 %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5582
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5583 instruct bytes_reverse_short(rRegI dst, eFlagsReg cr) %{
1396
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5584 match(Set dst (ReverseBytesS dst));
6138
ccaa67adfe5b 7063674: Wrong results from basic comparisons after calls to Long.bitCount(long)
twisti
parents: 6084
diff changeset
5585 effect(KILL cr);
1396
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5586
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5587 format %{ "BSWAP $dst\n\t"
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5588 "SAR $dst,16\n\t" %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5589 ins_encode %{
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5590 __ bswapl($dst$$Register);
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5591 __ sarl($dst$$Register, 16);
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5592 %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5593 ins_pipe( ialu_reg );
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5594 %}
d7f654633cfe 6946040: add intrinsic for short and char reverseBytes
never
parents: 1274
diff changeset
5595
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5596
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5597 //---------- Zeros Count Instructions ------------------------------------------
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5598
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5599 instruct countLeadingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5600 predicate(UseCountLeadingZerosInstruction);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5601 match(Set dst (CountLeadingZerosI src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5602 effect(KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5603
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5604 format %{ "LZCNT $dst, $src\t# count leading zeros (int)" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5605 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5606 __ lzcntl($dst$$Register, $src$$Register);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5607 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5608 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5609 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5610
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5611 instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5612 predicate(!UseCountLeadingZerosInstruction);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5613 match(Set dst (CountLeadingZerosI src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5614 effect(KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5615
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5616 format %{ "BSR $dst, $src\t# count leading zeros (int)\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5617 "JNZ skip\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5618 "MOV $dst, -1\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5619 "skip:\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5620 "NEG $dst\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5621 "ADD $dst, 31" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5622 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5623 Register Rdst = $dst$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5624 Register Rsrc = $src$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5625 Label skip;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5626 __ bsrl(Rdst, Rsrc);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5627 __ jccb(Assembler::notZero, skip);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5628 __ movl(Rdst, -1);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5629 __ bind(skip);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5630 __ negl(Rdst);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5631 __ addl(Rdst, BitsPerInt - 1);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5632 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5633 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5634 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5635
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5636 instruct countLeadingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5637 predicate(UseCountLeadingZerosInstruction);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5638 match(Set dst (CountLeadingZerosL src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5639 effect(TEMP dst, KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5640
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5641 format %{ "LZCNT $dst, $src.hi\t# count leading zeros (long)\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5642 "JNC done\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5643 "LZCNT $dst, $src.lo\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5644 "ADD $dst, 32\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5645 "done:" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5646 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5647 Register Rdst = $dst$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5648 Register Rsrc = $src$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5649 Label done;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5650 __ lzcntl(Rdst, HIGH_FROM_LOW(Rsrc));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5651 __ jccb(Assembler::carryClear, done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5652 __ lzcntl(Rdst, Rsrc);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5653 __ addl(Rdst, BitsPerInt);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5654 __ bind(done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5655 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5656 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5657 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5658
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5659 instruct countLeadingZerosL_bsr(rRegI dst, eRegL src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5660 predicate(!UseCountLeadingZerosInstruction);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5661 match(Set dst (CountLeadingZerosL src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5662 effect(TEMP dst, KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5663
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5664 format %{ "BSR $dst, $src.hi\t# count leading zeros (long)\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5665 "JZ msw_is_zero\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5666 "ADD $dst, 32\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5667 "JMP not_zero\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5668 "msw_is_zero:\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5669 "BSR $dst, $src.lo\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5670 "JNZ not_zero\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5671 "MOV $dst, -1\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5672 "not_zero:\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5673 "NEG $dst\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5674 "ADD $dst, 63\n" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5675 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5676 Register Rdst = $dst$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5677 Register Rsrc = $src$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5678 Label msw_is_zero;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5679 Label not_zero;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5680 __ bsrl(Rdst, HIGH_FROM_LOW(Rsrc));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5681 __ jccb(Assembler::zero, msw_is_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5682 __ addl(Rdst, BitsPerInt);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5683 __ jmpb(not_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5684 __ bind(msw_is_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5685 __ bsrl(Rdst, Rsrc);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5686 __ jccb(Assembler::notZero, not_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5687 __ movl(Rdst, -1);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5688 __ bind(not_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5689 __ negl(Rdst);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5690 __ addl(Rdst, BitsPerLong - 1);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5691 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5692 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5693 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5694
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5695 instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5696 match(Set dst (CountTrailingZerosI src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5697 effect(KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5698
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5699 format %{ "BSF $dst, $src\t# count trailing zeros (int)\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5700 "JNZ done\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5701 "MOV $dst, 32\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5702 "done:" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5703 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5704 Register Rdst = $dst$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5705 Label done;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5706 __ bsfl(Rdst, $src$$Register);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5707 __ jccb(Assembler::notZero, done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5708 __ movl(Rdst, BitsPerInt);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5709 __ bind(done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5710 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5711 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5712 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5713
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5714 instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5715 match(Set dst (CountTrailingZerosL src));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5716 effect(TEMP dst, KILL cr);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5717
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5718 format %{ "BSF $dst, $src.lo\t# count trailing zeros (long)\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5719 "JNZ done\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5720 "BSF $dst, $src.hi\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5721 "JNZ msw_not_zero\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5722 "MOV $dst, 32\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5723 "msw_not_zero:\n\t"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5724 "ADD $dst, 32\n"
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5725 "done:" %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5726 ins_encode %{
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5727 Register Rdst = $dst$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5728 Register Rsrc = $src$$Register;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5729 Label msw_not_zero;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5730 Label done;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5731 __ bsfl(Rdst, Rsrc);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5732 __ jccb(Assembler::notZero, done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5733 __ bsfl(Rdst, HIGH_FROM_LOW(Rsrc));
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5734 __ jccb(Assembler::notZero, msw_not_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5735 __ movl(Rdst, BitsPerInt);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5736 __ bind(msw_not_zero);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5737 __ addl(Rdst, BitsPerInt);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5738 __ bind(done);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5739 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5740 ins_pipe(ialu_reg);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5741 %}
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5742
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 681
diff changeset
5743
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5744 //---------- Population Count Instructions -------------------------------------
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5745
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5746 instruct popCountI(rRegI dst, rRegI src, eFlagsReg cr) %{
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5747 predicate(UsePopCountInstruction);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5748 match(Set dst (PopCountI src));
6138
ccaa67adfe5b 7063674: Wrong results from basic comparisons after calls to Long.bitCount(long)
twisti
parents: 6084
diff changeset
5749 effect(KILL cr);
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5750
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5751 format %{ "POPCNT $dst, $src" %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5752 ins_encode %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5753 __ popcntl($dst$$Register, $src$$Register);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5754 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5755 ins_pipe(ialu_reg);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5756 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5757
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5758 instruct popCountI_mem(rRegI dst, memory mem, eFlagsReg cr) %{
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5759 predicate(UsePopCountInstruction);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5760 match(Set dst (PopCountI (LoadI mem)));
6138
ccaa67adfe5b 7063674: Wrong results from basic comparisons after calls to Long.bitCount(long)
twisti
parents: 6084
diff changeset
5761 effect(KILL cr);
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5762
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5763 format %{ "POPCNT $dst, $mem" %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5764 ins_encode %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5765 __ popcntl($dst$$Register, $mem$$Address);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5766 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5767 ins_pipe(ialu_reg);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5768 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5769
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5770 // Note: Long.bitCount(long) returns an int.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5771 instruct popCountL(rRegI dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5772 predicate(UsePopCountInstruction);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5773 match(Set dst (PopCountL src));
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5774 effect(KILL cr, TEMP tmp, TEMP dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5775
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5776 format %{ "POPCNT $dst, $src.lo\n\t"
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5777 "POPCNT $tmp, $src.hi\n\t"
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5778 "ADD $dst, $tmp" %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5779 ins_encode %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5780 __ popcntl($dst$$Register, $src$$Register);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5781 __ popcntl($tmp$$Register, HIGH_FROM_LOW($src$$Register));
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5782 __ addl($dst$$Register, $tmp$$Register);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5783 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5784 ins_pipe(ialu_reg);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5785 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5786
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5787 // Note: Long.bitCount(long) returns an int.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5788 instruct popCountL_mem(rRegI dst, memory mem, rRegI tmp, eFlagsReg cr) %{
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5789 predicate(UsePopCountInstruction);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5790 match(Set dst (PopCountL (LoadL mem)));
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5791 effect(KILL cr, TEMP tmp, TEMP dst);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5792
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5793 format %{ "POPCNT $dst, $mem\n\t"
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5794 "POPCNT $tmp, $mem+4\n\t"
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5795 "ADD $dst, $tmp" %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5796 ins_encode %{
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5797 //__ popcntl($dst$$Register, $mem$$Address$$first);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5798 //__ popcntl($tmp$$Register, $mem$$Address$$second);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
5799 __ popcntl($dst$$Register, Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp, relocInfo::none));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
5800 __ popcntl($tmp$$Register, Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp + 4, relocInfo::none));
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5801 __ addl($dst$$Register, $tmp$$Register);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5802 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5803 ins_pipe(ialu_reg);
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5804 %}
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5805
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 624
diff changeset
5806
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5807 //----------Load/Store/Move Instructions---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5808 //----------Load Instructions--------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
5809 // Load Byte (8bit signed)
a61af66fc99e Initial load
duke
parents:
diff changeset
5810 instruct loadB(xRegI dst, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
5811 match(Set dst (LoadB mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
5812
a61af66fc99e Initial load
duke
parents:
diff changeset
5813 ins_cost(125);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5814 format %{ "MOVSX8 $dst,$mem\t# byte" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5815
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5816 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5817 __ movsbl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5818 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5819
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5820 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5821 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5822
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5823 // Load Byte (8bit signed) into Long Register
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5824 instruct loadB2L(eRegL dst, memory mem, eFlagsReg cr) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5825 match(Set dst (ConvI2L (LoadB mem)));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5826 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5827
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5828 ins_cost(375);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5829 format %{ "MOVSX8 $dst.lo,$mem\t# byte -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5830 "MOV $dst.hi,$dst.lo\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5831 "SAR $dst.hi,7" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5832
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5833 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5834 __ movsbl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5835 __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register.
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5836 __ sarl(HIGH_FROM_LOW($dst$$Register), 7); // 24+1 MSB are already signed extended.
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5837 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5838
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5839 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5840 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5841
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5842 // Load Unsigned Byte (8bit UNsigned)
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5843 instruct loadUB(xRegI dst, memory mem) %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5844 match(Set dst (LoadUB mem));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5845
a61af66fc99e Initial load
duke
parents:
diff changeset
5846 ins_cost(125);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5847 format %{ "MOVZX8 $dst,$mem\t# ubyte -> int" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5848
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5849 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5850 __ movzbl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5851 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5852
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5853 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5854 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5855
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5856 // Load Unsigned Byte (8 bit UNsigned) into Long Register
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5857 instruct loadUB2L(eRegL dst, memory mem, eFlagsReg cr) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5858 match(Set dst (ConvI2L (LoadUB mem)));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5859 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5860
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5861 ins_cost(250);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5862 format %{ "MOVZX8 $dst.lo,$mem\t# ubyte -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5863 "XOR $dst.hi,$dst.hi" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5864
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5865 ins_encode %{
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5866 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5867 __ movzbl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5868 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5869 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5870
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5871 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5872 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5873
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5874 // Load Unsigned Byte (8 bit UNsigned) with mask into Long Register
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5875 instruct loadUB2L_immI8(eRegL dst, memory mem, immI8 mask, eFlagsReg cr) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5876 match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5877 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5878
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5879 format %{ "MOVZX8 $dst.lo,$mem\t# ubyte & 8-bit mask -> long\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5880 "XOR $dst.hi,$dst.hi\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5881 "AND $dst.lo,$mask" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5882 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5883 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5884 __ movzbl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5885 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5886 __ andl(Rdst, $mask$$constant);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5887 %}
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5888 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5889 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5890
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5891 // Load Short (16bit signed)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5892 instruct loadS(rRegI dst, memory mem) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5893 match(Set dst (LoadS mem));
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5894
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5895 ins_cost(125);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5896 format %{ "MOVSX $dst,$mem\t# short" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5897
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5898 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5899 __ movswl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5900 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5901
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5902 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5903 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5904
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5905 // Load Short (16 bit signed) to Byte (8 bit signed)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5906 instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5907 match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5908
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5909 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5910 format %{ "MOVSX $dst, $mem\t# short -> byte" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5911 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5912 __ movsbl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5913 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5914 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5915 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5916
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5917 // Load Short (16bit signed) into Long Register
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5918 instruct loadS2L(eRegL dst, memory mem, eFlagsReg cr) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5919 match(Set dst (ConvI2L (LoadS mem)));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5920 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5921
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5922 ins_cost(375);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5923 format %{ "MOVSX $dst.lo,$mem\t# short -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5924 "MOV $dst.hi,$dst.lo\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5925 "SAR $dst.hi,15" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5926
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5927 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5928 __ movswl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5929 __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register.
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5930 __ sarl(HIGH_FROM_LOW($dst$$Register), 15); // 16+1 MSB are already signed extended.
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5931 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5932
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5933 ins_pipe(ialu_reg_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5934 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5935
558
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
5936 // Load Unsigned Short/Char (16bit unsigned)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5937 instruct loadUS(rRegI dst, memory mem) %{
558
3b5ac9e7e6ea 6796746: rename LoadC (char) opcode class to LoadUS (unsigned short)
twisti
parents: 420
diff changeset
5938 match(Set dst (LoadUS mem));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5939
a61af66fc99e Initial load
duke
parents:
diff changeset
5940 ins_cost(125);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5941 format %{ "MOVZX $dst,$mem\t# ushort/char -> int" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5942
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5943 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5944 __ movzwl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5945 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5946
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5947 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5948 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5949
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5950 // Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
5951 instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5952 match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5953
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5954 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5955 format %{ "MOVSX $dst, $mem\t# ushort -> byte" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5956 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5957 __ movsbl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5958 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5959 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5960 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
5961
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5962 // Load Unsigned Short/Char (16 bit UNsigned) into Long Register
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5963 instruct loadUS2L(eRegL dst, memory mem, eFlagsReg cr) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5964 match(Set dst (ConvI2L (LoadUS mem)));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5965 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5966
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5967 ins_cost(250);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5968 format %{ "MOVZX $dst.lo,$mem\t# ushort/char -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5969 "XOR $dst.hi,$dst.hi" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5970
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5971 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5972 __ movzwl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5973 __ xorl(HIGH_FROM_LOW($dst$$Register), HIGH_FROM_LOW($dst$$Register));
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5974 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5975
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
5976 ins_pipe(ialu_reg_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5977 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
5978
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5979 // Load Unsigned Short/Char (16 bit UNsigned) with mask 0xFF into Long Register
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5980 instruct loadUS2L_immI_255(eRegL dst, memory mem, immI_255 mask, eFlagsReg cr) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5981 match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5982 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5983
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5984 format %{ "MOVZX8 $dst.lo,$mem\t# ushort/char & 0xFF -> long\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5985 "XOR $dst.hi,$dst.hi" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5986 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5987 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5988 __ movzbl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5989 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5990 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5991 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5992 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5993
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5994 // Load Unsigned Short/Char (16 bit UNsigned) with a 16-bit mask into Long Register
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5995 instruct loadUS2L_immI16(eRegL dst, memory mem, immI16 mask, eFlagsReg cr) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5996 match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5997 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5998
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
5999 format %{ "MOVZX $dst.lo, $mem\t# ushort/char & 16-bit mask -> long\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6000 "XOR $dst.hi,$dst.hi\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6001 "AND $dst.lo,$mask" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6002 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6003 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6004 __ movzwl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6005 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6006 __ andl(Rdst, $mask$$constant);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6007 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6008 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6009 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6010
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6011 // Load Integer
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6012 instruct loadI(rRegI dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6013 match(Set dst (LoadI mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6014
a61af66fc99e Initial load
duke
parents:
diff changeset
6015 ins_cost(125);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6016 format %{ "MOV $dst,$mem\t# int" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6017
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6018 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6019 __ movl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6020 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6021
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6022 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6023 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6024
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6025 // Load Integer (32 bit signed) to Byte (8 bit signed)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6026 instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6027 match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6028
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6029 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6030 format %{ "MOVSX $dst, $mem\t# int -> byte" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6031 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6032 __ movsbl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6033 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6034 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6035 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6036
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6037 // Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6038 instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6039 match(Set dst (AndI (LoadI mem) mask));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6040
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6041 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6042 format %{ "MOVZX $dst, $mem\t# int -> ubyte" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6043 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6044 __ movzbl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6045 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6046 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6047 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6048
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6049 // Load Integer (32 bit signed) to Short (16 bit signed)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6050 instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6051 match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6052
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6053 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6054 format %{ "MOVSX $dst, $mem\t# int -> short" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6055 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6056 __ movswl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6057 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6058 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6059 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6060
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6061 // Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6062 instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6063 match(Set dst (AndI (LoadI mem) mask));
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6064
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6065 ins_cost(125);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6066 format %{ "MOVZX $dst, $mem\t# int -> ushort/char" %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6067 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6068 __ movzwl($dst$$Register, $mem$$Address);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6069 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6070 ins_pipe(ialu_reg_mem);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6071 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
6072
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6073 // Load Integer into Long Register
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6074 instruct loadI2L(eRegL dst, memory mem, eFlagsReg cr) %{
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6075 match(Set dst (ConvI2L (LoadI mem)));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6076 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6077
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6078 ins_cost(375);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6079 format %{ "MOV $dst.lo,$mem\t# int -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6080 "MOV $dst.hi,$dst.lo\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6081 "SAR $dst.hi,31" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6082
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6083 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6084 __ movl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6085 __ movl(HIGH_FROM_LOW($dst$$Register), $dst$$Register); // This is always a different register.
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6086 __ sarl(HIGH_FROM_LOW($dst$$Register), 31);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6087 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6088
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6089 ins_pipe(ialu_reg_mem);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6090 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6091
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6092 // Load Integer with mask 0xFF into Long Register
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6093 instruct loadI2L_immI_255(eRegL dst, memory mem, immI_255 mask, eFlagsReg cr) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6094 match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6095 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6096
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6097 format %{ "MOVZX8 $dst.lo,$mem\t# int & 0xFF -> long\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6098 "XOR $dst.hi,$dst.hi" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6099 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6100 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6101 __ movzbl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6102 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6103 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6104 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6105 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6106
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6107 // Load Integer with mask 0xFFFF into Long Register
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6108 instruct loadI2L_immI_65535(eRegL dst, memory mem, immI_65535 mask, eFlagsReg cr) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6109 match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6110 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6111
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6112 format %{ "MOVZX $dst.lo,$mem\t# int & 0xFFFF -> long\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6113 "XOR $dst.hi,$dst.hi" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6114 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6115 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6116 __ movzwl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6117 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6118 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6119 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6120 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6121
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
6122 // Load Integer with 32-bit mask into Long Register
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
6123 instruct loadI2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6124 match(Set dst (ConvI2L (AndI (LoadI mem) mask)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6125 effect(KILL cr);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6126
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
6127 format %{ "MOV $dst.lo,$mem\t# int & 32-bit mask -> long\n\t"
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6128 "XOR $dst.hi,$dst.hi\n\t"
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6129 "AND $dst.lo,$mask" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6130 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6131 Register Rdst = $dst$$Register;
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6132 __ movl(Rdst, $mem$$Address);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6133 __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6134 __ andl(Rdst, $mask$$constant);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6135 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6136 ins_pipe(ialu_reg_mem);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6137 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6138
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6139 // Load Unsigned Integer into Long Register
6849
f6badecb7ea7 7199654: Remove LoadUI2LNode
vlivanov
parents: 6848
diff changeset
6140 instruct loadUI2L(eRegL dst, memory mem, immL_32bits mask, eFlagsReg cr) %{
f6badecb7ea7 7199654: Remove LoadUI2LNode
vlivanov
parents: 6848
diff changeset
6141 match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6142 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6143
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6144 ins_cost(250);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6145 format %{ "MOV $dst.lo,$mem\t# uint -> long\n\t"
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6146 "XOR $dst.hi,$dst.hi" %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6147
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6148 ins_encode %{
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6149 __ movl($dst$$Register, $mem$$Address);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6150 __ xorl(HIGH_FROM_LOW($dst$$Register), HIGH_FROM_LOW($dst$$Register));
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6151 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6152
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6153 ins_pipe(ialu_reg_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6154 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6155
a61af66fc99e Initial load
duke
parents:
diff changeset
6156 // Load Long. Cannot clobber address while loading, so restrict address
a61af66fc99e Initial load
duke
parents:
diff changeset
6157 // register to ESI
a61af66fc99e Initial load
duke
parents:
diff changeset
6158 instruct loadL(eRegL dst, load_long_memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6159 predicate(!((LoadLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6160 match(Set dst (LoadL mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6161
a61af66fc99e Initial load
duke
parents:
diff changeset
6162 ins_cost(250);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6163 format %{ "MOV $dst.lo,$mem\t# long\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6164 "MOV $dst.hi,$mem+4" %}
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6165
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6166 ins_encode %{
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
6167 Address Amemlo = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp, relocInfo::none);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
6168 Address Amemhi = Address::make_raw($mem$$base, $mem$$index, $mem$$scale, $mem$$disp + 4, relocInfo::none);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6169 __ movl($dst$$Register, Amemlo);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6170 __ movl(HIGH_FROM_LOW($dst$$Register), Amemhi);
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6171 %}
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6172
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
6173 ins_pipe(ialu_reg_long_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6174 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6175
a61af66fc99e Initial load
duke
parents:
diff changeset
6176 // Volatile Load Long. Must be atomic, so do 64-bit FILD
a61af66fc99e Initial load
duke
parents:
diff changeset
6177 // then store it down to the stack and reload on the int
a61af66fc99e Initial load
duke
parents:
diff changeset
6178 // side.
a61af66fc99e Initial load
duke
parents:
diff changeset
6179 instruct loadL_volatile(stackSlotL dst, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6180 predicate(UseSSE<=1 && ((LoadLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6181 match(Set dst (LoadL mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6182
a61af66fc99e Initial load
duke
parents:
diff changeset
6183 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
6184 format %{ "FILD $mem\t# Atomic volatile long load\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6185 "FISTp $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6186 ins_encode(enc_loadL_volatile(mem,dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
6187 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6188 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6189
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6190 instruct loadLX_volatile(stackSlotL dst, memory mem, regD tmp) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6191 predicate(UseSSE>=2 && ((LoadLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6192 match(Set dst (LoadL mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6193 effect(TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6194 ins_cost(180);
a61af66fc99e Initial load
duke
parents:
diff changeset
6195 format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6196 "MOVSD $dst,$tmp" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6197 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6198 __ movdbl($tmp$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6199 __ movdbl(Address(rsp, $dst$$disp), $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6200 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6201 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6202 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6203
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6204 instruct loadLX_reg_volatile(eRegL dst, memory mem, regD tmp) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6205 predicate(UseSSE>=2 && ((LoadLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6206 match(Set dst (LoadL mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6207 effect(TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
6208 ins_cost(160);
a61af66fc99e Initial load
duke
parents:
diff changeset
6209 format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6210 "MOVD $dst.lo,$tmp\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6211 "PSRLQ $tmp,32\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6212 "MOVD $dst.hi,$tmp" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6213 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6214 __ movdbl($tmp$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6215 __ movdl($dst$$Register, $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6216 __ psrlq($tmp$$XMMRegister, 32);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6217 __ movdl(HIGH_FROM_LOW($dst$$Register), $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6218 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6219 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6220 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6221
a61af66fc99e Initial load
duke
parents:
diff changeset
6222 // Load Range
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6223 instruct loadRange(rRegI dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6224 match(Set dst (LoadRange mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6225
a61af66fc99e Initial load
duke
parents:
diff changeset
6226 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6227 format %{ "MOV $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6228 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6229 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6230 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6231 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6232
a61af66fc99e Initial load
duke
parents:
diff changeset
6233
a61af66fc99e Initial load
duke
parents:
diff changeset
6234 // Load Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
6235 instruct loadP(eRegP dst, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6236 match(Set dst (LoadP mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6237
a61af66fc99e Initial load
duke
parents:
diff changeset
6238 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6239 format %{ "MOV $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6240 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6241 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6242 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6243 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6244
a61af66fc99e Initial load
duke
parents:
diff changeset
6245 // Load Klass Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
6246 instruct loadKlass(eRegP dst, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6247 match(Set dst (LoadKlass mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6248
a61af66fc99e Initial load
duke
parents:
diff changeset
6249 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6250 format %{ "MOV $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6251 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6252 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6253 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6254 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6255
a61af66fc99e Initial load
duke
parents:
diff changeset
6256 // Load Double
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6257 instruct loadDPR(regDPR dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6258 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6259 match(Set dst (LoadD mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6260
a61af66fc99e Initial load
duke
parents:
diff changeset
6261 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6262 format %{ "FLD_D ST,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6263 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6264 opcode(0xDD); /* DD /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6265 ins_encode( OpcP, RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6266 Pop_Reg_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6267 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6268 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6269
a61af66fc99e Initial load
duke
parents:
diff changeset
6270 // Load Double to XMM
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6271 instruct loadD(regD dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6272 predicate(UseSSE>=2 && UseXmmLoadAndClearUpper);
a61af66fc99e Initial load
duke
parents:
diff changeset
6273 match(Set dst (LoadD mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6274 ins_cost(145);
a61af66fc99e Initial load
duke
parents:
diff changeset
6275 format %{ "MOVSD $dst,$mem" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6276 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6277 __ movdbl ($dst$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6278 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6279 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6280 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6281
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6282 instruct loadD_partial(regD dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6283 predicate(UseSSE>=2 && !UseXmmLoadAndClearUpper);
a61af66fc99e Initial load
duke
parents:
diff changeset
6284 match(Set dst (LoadD mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6285 ins_cost(145);
a61af66fc99e Initial load
duke
parents:
diff changeset
6286 format %{ "MOVLPD $dst,$mem" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6287 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6288 __ movdbl ($dst$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6289 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6290 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6291 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6292
a61af66fc99e Initial load
duke
parents:
diff changeset
6293 // Load to XMM register (single-precision floating point)
a61af66fc99e Initial load
duke
parents:
diff changeset
6294 // MOVSS instruction
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6295 instruct loadF(regF dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6296 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6297 match(Set dst (LoadF mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6298 ins_cost(145);
a61af66fc99e Initial load
duke
parents:
diff changeset
6299 format %{ "MOVSS $dst,$mem" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6300 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6301 __ movflt ($dst$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6302 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6303 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6304 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6305
a61af66fc99e Initial load
duke
parents:
diff changeset
6306 // Load Float
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6307 instruct loadFPR(regFPR dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6308 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6309 match(Set dst (LoadF mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6310
a61af66fc99e Initial load
duke
parents:
diff changeset
6311 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6312 format %{ "FLD_S ST,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6313 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6314 opcode(0xD9); /* D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6315 ins_encode( OpcP, RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6316 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6317 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6318 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6319
a61af66fc99e Initial load
duke
parents:
diff changeset
6320 // Load Effective Address
a61af66fc99e Initial load
duke
parents:
diff changeset
6321 instruct leaP8(eRegP dst, indOffset8 mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6322 match(Set dst mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6323
a61af66fc99e Initial load
duke
parents:
diff changeset
6324 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
6325 format %{ "LEA $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6326 opcode(0x8D);
a61af66fc99e Initial load
duke
parents:
diff changeset
6327 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6328 ins_pipe( ialu_reg_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6329 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6330
a61af66fc99e Initial load
duke
parents:
diff changeset
6331 instruct leaP32(eRegP dst, indOffset32 mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6332 match(Set dst mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6333
a61af66fc99e Initial load
duke
parents:
diff changeset
6334 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
6335 format %{ "LEA $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6336 opcode(0x8D);
a61af66fc99e Initial load
duke
parents:
diff changeset
6337 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6338 ins_pipe( ialu_reg_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6339 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6340
a61af66fc99e Initial load
duke
parents:
diff changeset
6341 instruct leaPIdxOff(eRegP dst, indIndexOffset mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6342 match(Set dst mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6343
a61af66fc99e Initial load
duke
parents:
diff changeset
6344 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
6345 format %{ "LEA $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6346 opcode(0x8D);
a61af66fc99e Initial load
duke
parents:
diff changeset
6347 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6348 ins_pipe( ialu_reg_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6349 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6350
a61af66fc99e Initial load
duke
parents:
diff changeset
6351 instruct leaPIdxScale(eRegP dst, indIndexScale mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6352 match(Set dst mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6353
a61af66fc99e Initial load
duke
parents:
diff changeset
6354 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
6355 format %{ "LEA $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6356 opcode(0x8D);
a61af66fc99e Initial load
duke
parents:
diff changeset
6357 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6358 ins_pipe( ialu_reg_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6359 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6360
a61af66fc99e Initial load
duke
parents:
diff changeset
6361 instruct leaPIdxScaleOff(eRegP dst, indIndexScaleOffset mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6362 match(Set dst mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6363
a61af66fc99e Initial load
duke
parents:
diff changeset
6364 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
6365 format %{ "LEA $dst,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6366 opcode(0x8D);
a61af66fc99e Initial load
duke
parents:
diff changeset
6367 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
6368 ins_pipe( ialu_reg_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6369 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6370
a61af66fc99e Initial load
duke
parents:
diff changeset
6371 // Load Constant
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6372 instruct loadConI(rRegI dst, immI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6373 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6374
a61af66fc99e Initial load
duke
parents:
diff changeset
6375 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6376 ins_encode( LdImmI(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6377 ins_pipe( ialu_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6378 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6379
a61af66fc99e Initial load
duke
parents:
diff changeset
6380 // Load Constant zero
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6381 instruct loadConI0(rRegI dst, immI0 src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6382 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6383 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
6384
a61af66fc99e Initial load
duke
parents:
diff changeset
6385 ins_cost(50);
a61af66fc99e Initial load
duke
parents:
diff changeset
6386 format %{ "XOR $dst,$dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6387 opcode(0x33); /* + rd */
a61af66fc99e Initial load
duke
parents:
diff changeset
6388 ins_encode( OpcP, RegReg( dst, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6389 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6390 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6391
a61af66fc99e Initial load
duke
parents:
diff changeset
6392 instruct loadConP(eRegP dst, immP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6393 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6394
a61af66fc99e Initial load
duke
parents:
diff changeset
6395 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6396 opcode(0xB8); /* + rd */
a61af66fc99e Initial load
duke
parents:
diff changeset
6397 ins_encode( LdImmP(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6398 ins_pipe( ialu_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6399 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6400
a61af66fc99e Initial load
duke
parents:
diff changeset
6401 instruct loadConL(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6402 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6403 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
6404 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
6405 format %{ "MOV $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6406 "MOV $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6407 opcode(0xB8);
a61af66fc99e Initial load
duke
parents:
diff changeset
6408 ins_encode( LdImmL_Lo(dst, src), LdImmL_Hi(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6409 ins_pipe( ialu_reg_long_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
6410 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6411
a61af66fc99e Initial load
duke
parents:
diff changeset
6412 instruct loadConL0(eRegL dst, immL0 src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6413 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6414 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
6415 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6416 format %{ "XOR $dst.lo,$dst.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6417 "XOR $dst.hi,$dst.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6418 opcode(0x33,0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
6419 ins_encode( RegReg_Lo(dst,dst), RegReg_Hi(dst, dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6420 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
6421 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6422
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6423 // The instruction usage is guarded by predicate in operand immFPR().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6424 instruct loadConFPR(regFPR dst, immFPR con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6425 match(Set dst con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6426 ins_cost(125);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6427 format %{ "FLD_S ST,[$constantaddress]\t# load from constant table: float=$con\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6428 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6429 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6430 __ fld_s($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6431 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6432 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6433 ins_pipe(fpu_reg_con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6434 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6435
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6436 // The instruction usage is guarded by predicate in operand immFPR0().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6437 instruct loadConFPR0(regFPR dst, immFPR0 con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6438 match(Set dst con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6439 ins_cost(125);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6440 format %{ "FLDZ ST\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6441 "FSTP $dst" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6442 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6443 __ fldz();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6444 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6445 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6446 ins_pipe(fpu_reg_con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6447 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6448
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6449 // The instruction usage is guarded by predicate in operand immFPR1().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6450 instruct loadConFPR1(regFPR dst, immFPR1 con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6451 match(Set dst con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6452 ins_cost(125);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6453 format %{ "FLD1 ST\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6454 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6455 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6456 __ fld1();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6457 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6458 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6459 ins_pipe(fpu_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6460 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6461
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6462 // The instruction usage is guarded by predicate in operand immF().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6463 instruct loadConF(regF dst, immF con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6464 match(Set dst con);
a61af66fc99e Initial load
duke
parents:
diff changeset
6465 ins_cost(125);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6466 format %{ "MOVSS $dst,[$constantaddress]\t# load from constant table: float=$con" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6467 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6468 __ movflt($dst$$XMMRegister, $constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6469 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6470 ins_pipe(pipe_slow);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6471 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6472
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6473 // The instruction usage is guarded by predicate in operand immF0().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6474 instruct loadConF0(regF dst, immF0 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6475 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6476 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6477 format %{ "XORPS $dst,$dst\t# float 0.0" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6478 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6479 __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6480 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6481 ins_pipe(pipe_slow);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6482 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6483
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6484 // The instruction usage is guarded by predicate in operand immDPR().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6485 instruct loadConDPR(regDPR dst, immDPR con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6486 match(Set dst con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6487 ins_cost(125);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6488
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6489 format %{ "FLD_D ST,[$constantaddress]\t# load from constant table: double=$con\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6490 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6491 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6492 __ fld_d($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6493 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6494 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6495 ins_pipe(fpu_reg_con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6496 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6497
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6498 // The instruction usage is guarded by predicate in operand immDPR0().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6499 instruct loadConDPR0(regDPR dst, immDPR0 con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6500 match(Set dst con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6501 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6502
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6503 format %{ "FLDZ ST\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6504 "FSTP $dst" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6505 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6506 __ fldz();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6507 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6508 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6509 ins_pipe(fpu_reg_con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6510 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6511
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6512 // The instruction usage is guarded by predicate in operand immDPR1().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6513 instruct loadConDPR1(regDPR dst, immDPR1 con) %{
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6514 match(Set dst con);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6515 ins_cost(125);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6516
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6517 format %{ "FLD1 ST\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6518 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6519 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6520 __ fld1();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6521 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6522 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6523 ins_pipe(fpu_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6524 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6525
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6526 // The instruction usage is guarded by predicate in operand immD().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6527 instruct loadConD(regD dst, immD con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6528 match(Set dst con);
a61af66fc99e Initial load
duke
parents:
diff changeset
6529 ins_cost(125);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6530 format %{ "MOVSD $dst,[$constantaddress]\t# load from constant table: double=$con" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6531 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6532 __ movdbl($dst$$XMMRegister, $constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6533 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
6534 ins_pipe(pipe_slow);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6535 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6536
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6537 // The instruction usage is guarded by predicate in operand immD0().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6538 instruct loadConD0(regD dst, immD0 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6539 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6540 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6541 format %{ "XORPD $dst,$dst\t# double 0.0" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6542 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6543 __ xorpd ($dst$$XMMRegister, $dst$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6544 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6545 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6546 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6547
a61af66fc99e Initial load
duke
parents:
diff changeset
6548 // Load Stack Slot
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6549 instruct loadSSI(rRegI dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6550 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6551 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6552
a61af66fc99e Initial load
duke
parents:
diff changeset
6553 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6554 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6555 ins_encode( OpcP, RegMem(dst,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6556 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6557 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6558
a61af66fc99e Initial load
duke
parents:
diff changeset
6559 instruct loadSSL(eRegL dst, stackSlotL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6560 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6561
a61af66fc99e Initial load
duke
parents:
diff changeset
6562 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
6563 format %{ "MOV $dst,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6564 "MOV $dst+4,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6565 opcode(0x8B, 0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6566 ins_encode( OpcP, RegMem( dst, src ), OpcS, RegMem_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6567 ins_pipe( ialu_mem_long_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6568 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6569
a61af66fc99e Initial load
duke
parents:
diff changeset
6570 // Load Stack Slot
a61af66fc99e Initial load
duke
parents:
diff changeset
6571 instruct loadSSP(eRegP dst, stackSlotP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6572 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6573 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6574
a61af66fc99e Initial load
duke
parents:
diff changeset
6575 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6576 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6577 ins_encode( OpcP, RegMem(dst,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6578 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6579 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6580
a61af66fc99e Initial load
duke
parents:
diff changeset
6581 // Load Stack Slot
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6582 instruct loadSSF(regFPR dst, stackSlotF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6583 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6584 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6585
a61af66fc99e Initial load
duke
parents:
diff changeset
6586 format %{ "FLD_S $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6587 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6588 opcode(0xD9); /* D9 /0, FLD m32real */
a61af66fc99e Initial load
duke
parents:
diff changeset
6589 ins_encode( OpcP, RMopc_Mem_no_oop(0x00,src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6590 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6591 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6592 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6593
a61af66fc99e Initial load
duke
parents:
diff changeset
6594 // Load Stack Slot
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6595 instruct loadSSD(regDPR dst, stackSlotD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6596 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
6597 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6598
a61af66fc99e Initial load
duke
parents:
diff changeset
6599 format %{ "FLD_D $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6600 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6601 opcode(0xDD); /* DD /0, FLD m64real */
a61af66fc99e Initial load
duke
parents:
diff changeset
6602 ins_encode( OpcP, RMopc_Mem_no_oop(0x00,src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6603 Pop_Reg_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6604 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6605 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6606
a61af66fc99e Initial load
duke
parents:
diff changeset
6607 // Prefetch instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
6608 // Must be safe to execute with invalid address (cannot fault).
a61af66fc99e Initial load
duke
parents:
diff changeset
6609
a61af66fc99e Initial load
duke
parents:
diff changeset
6610 instruct prefetchr0( memory mem ) %{
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 2401
diff changeset
6611 predicate(UseSSE==0 && !VM_Version::supports_3dnow_prefetch());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6612 match(PrefetchRead mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6613 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6614 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6615 format %{ "PREFETCHR (non-SSE is empty encoding)" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6616 ins_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
6617 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
6618 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6619
a61af66fc99e Initial load
duke
parents:
diff changeset
6620 instruct prefetchr( memory mem ) %{
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 2401
diff changeset
6621 predicate(UseSSE==0 && VM_Version::supports_3dnow_prefetch() || ReadPrefetchInstr==3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6622 match(PrefetchRead mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6623 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6624
a61af66fc99e Initial load
duke
parents:
diff changeset
6625 format %{ "PREFETCHR $mem\t! Prefetch into level 1 cache for read" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6626 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6627 __ prefetchr($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6628 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6629 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6630 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6631
a61af66fc99e Initial load
duke
parents:
diff changeset
6632 instruct prefetchrNTA( memory mem ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6633 predicate(UseSSE>=1 && ReadPrefetchInstr==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6634 match(PrefetchRead mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6635 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6636
a61af66fc99e Initial load
duke
parents:
diff changeset
6637 format %{ "PREFETCHNTA $mem\t! Prefetch into non-temporal cache for read" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6638 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6639 __ prefetchnta($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6640 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6641 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6642 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6643
a61af66fc99e Initial load
duke
parents:
diff changeset
6644 instruct prefetchrT0( memory mem ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6645 predicate(UseSSE>=1 && ReadPrefetchInstr==1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6646 match(PrefetchRead mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6647 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6648
a61af66fc99e Initial load
duke
parents:
diff changeset
6649 format %{ "PREFETCHT0 $mem\t! Prefetch into L1 and L2 caches for read" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6650 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6651 __ prefetcht0($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6652 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6653 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6654 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6655
a61af66fc99e Initial load
duke
parents:
diff changeset
6656 instruct prefetchrT2( memory mem ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6657 predicate(UseSSE>=1 && ReadPrefetchInstr==2);
a61af66fc99e Initial load
duke
parents:
diff changeset
6658 match(PrefetchRead mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6659 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6660
a61af66fc99e Initial load
duke
parents:
diff changeset
6661 format %{ "PREFETCHT2 $mem\t! Prefetch into L2 cache for read" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6662 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6663 __ prefetcht2($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6664 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6665 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6666 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6667
a61af66fc99e Initial load
duke
parents:
diff changeset
6668 instruct prefetchw0( memory mem ) %{
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 2401
diff changeset
6669 predicate(UseSSE==0 && !VM_Version::supports_3dnow_prefetch());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6670 match(PrefetchWrite mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6671 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6672 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6673 format %{ "Prefetch (non-SSE is empty encoding)" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6674 ins_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
6675 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
6676 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6677
a61af66fc99e Initial load
duke
parents:
diff changeset
6678 instruct prefetchw( memory mem ) %{
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6679 predicate(UseSSE==0 && VM_Version::supports_3dnow_prefetch());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6680 match( PrefetchWrite mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6681 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6682
a61af66fc99e Initial load
duke
parents:
diff changeset
6683 format %{ "PREFETCHW $mem\t! Prefetch into L1 cache and mark modified" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6684 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6685 __ prefetchw($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6686 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6687 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6688 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6689
a61af66fc99e Initial load
duke
parents:
diff changeset
6690 instruct prefetchwNTA( memory mem ) %{
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6691 predicate(UseSSE>=1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6692 match(PrefetchWrite mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6693 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6694
a61af66fc99e Initial load
duke
parents:
diff changeset
6695 format %{ "PREFETCHNTA $mem\t! Prefetch into non-temporal cache for write" %}
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6696 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6697 __ prefetchnta($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6698 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6699 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6700 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6701
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6702 // Prefetch instructions for allocation.
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6703
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6704 instruct prefetchAlloc0( memory mem ) %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6705 predicate(UseSSE==0 && AllocatePrefetchInstr!=3);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6706 match(PrefetchAllocation mem);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6707 ins_cost(0);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6708 size(0);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6709 format %{ "Prefetch allocation (non-SSE is empty encoding)" %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6710 ins_encode();
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6711 ins_pipe(empty);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6712 %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6713
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6714 instruct prefetchAlloc( memory mem ) %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6715 predicate(AllocatePrefetchInstr==3);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6716 match( PrefetchAllocation mem );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6717 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6718
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6719 format %{ "PREFETCHW $mem\t! Prefetch allocation into L1 cache and mark modified" %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6720 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6721 __ prefetchw($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6722 %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6723 ins_pipe(ialu_mem);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6724 %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6725
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6726 instruct prefetchAllocNTA( memory mem ) %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6727 predicate(UseSSE>=1 && AllocatePrefetchInstr==0);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6728 match(PrefetchAllocation mem);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6729 ins_cost(100);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6730
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6731 format %{ "PREFETCHNTA $mem\t! Prefetch allocation into non-temporal cache for write" %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6732 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6733 __ prefetchnta($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6734 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6735 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6736 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6737
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6738 instruct prefetchAllocT0( memory mem ) %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6739 predicate(UseSSE>=1 && AllocatePrefetchInstr==1);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6740 match(PrefetchAllocation mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6741 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6742
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6743 format %{ "PREFETCHT0 $mem\t! Prefetch allocation into L1 and L2 caches for write" %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6744 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6745 __ prefetcht0($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6746 %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6747 ins_pipe(ialu_mem);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6748 %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6749
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6750 instruct prefetchAllocT2( memory mem ) %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6751 predicate(UseSSE>=1 && AllocatePrefetchInstr==2);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6752 match(PrefetchAllocation mem);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6753 ins_cost(100);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6754
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6755 format %{ "PREFETCHT2 $mem\t! Prefetch allocation into L2 cache for write" %}
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6756 ins_encode %{
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6757 __ prefetcht2($mem$$Address);
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3851
diff changeset
6758 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6759 ins_pipe(ialu_mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
6760 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6761
a61af66fc99e Initial load
duke
parents:
diff changeset
6762 //----------Store Instructions-------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
6763
a61af66fc99e Initial load
duke
parents:
diff changeset
6764 // Store Byte
a61af66fc99e Initial load
duke
parents:
diff changeset
6765 instruct storeB(memory mem, xRegI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6766 match(Set mem (StoreB mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6767
a61af66fc99e Initial load
duke
parents:
diff changeset
6768 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6769 format %{ "MOV8 $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6770 opcode(0x88);
a61af66fc99e Initial load
duke
parents:
diff changeset
6771 ins_encode( OpcP, RegMem( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6772 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6773 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6774
a61af66fc99e Initial load
duke
parents:
diff changeset
6775 // Store Char/Short
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6776 instruct storeC(memory mem, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6777 match(Set mem (StoreC mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6778
a61af66fc99e Initial load
duke
parents:
diff changeset
6779 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6780 format %{ "MOV16 $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6781 opcode(0x89, 0x66);
a61af66fc99e Initial load
duke
parents:
diff changeset
6782 ins_encode( OpcS, OpcP, RegMem( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6783 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6784 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6785
a61af66fc99e Initial load
duke
parents:
diff changeset
6786 // Store Integer
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
6787 instruct storeI(memory mem, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6788 match(Set mem (StoreI mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6789
a61af66fc99e Initial load
duke
parents:
diff changeset
6790 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6791 format %{ "MOV $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6792 opcode(0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
6793 ins_encode( OpcP, RegMem( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6794 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6795 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6796
a61af66fc99e Initial load
duke
parents:
diff changeset
6797 // Store Long
a61af66fc99e Initial load
duke
parents:
diff changeset
6798 instruct storeL(long_memory mem, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6799 predicate(!((StoreLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6800 match(Set mem (StoreL mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6801
a61af66fc99e Initial load
duke
parents:
diff changeset
6802 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
6803 format %{ "MOV $mem,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6804 "MOV $mem+4,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6805 opcode(0x89, 0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
6806 ins_encode( OpcP, RegMem( src, mem ), OpcS, RegMem_Hi( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6807 ins_pipe( ialu_mem_long_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6808 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6809
824
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6810 // Store Long to Integer
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6811 instruct storeL2I(memory mem, eRegL src) %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6812 match(Set mem (StoreI mem (ConvL2I src)));
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6813
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6814 format %{ "MOV $mem,$src.lo\t# long -> int" %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6815 ins_encode %{
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6816 __ movl($mem$$Address, $src$$Register);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6817 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6818 ins_pipe(ialu_mem_reg);
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6819 %}
18a08a7e16b5 5057225: Remove useless I2L conversions
twisti
parents: 785
diff changeset
6820
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6821 // Volatile Store Long. Must be atomic, so move it into
a61af66fc99e Initial load
duke
parents:
diff changeset
6822 // the FP TOS and then do a 64-bit FIST. Has to probe the
a61af66fc99e Initial load
duke
parents:
diff changeset
6823 // target address before the store (for null-ptr checks)
a61af66fc99e Initial load
duke
parents:
diff changeset
6824 // so the memory operand is used twice in the encoding.
a61af66fc99e Initial load
duke
parents:
diff changeset
6825 instruct storeL_volatile(memory mem, stackSlotL src, eFlagsReg cr ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6826 predicate(UseSSE<=1 && ((StoreLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6827 match(Set mem (StoreL mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6828 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
6829 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
6830 format %{ "CMP $mem,EAX\t# Probe address for implicit null check\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6831 "FILD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6832 "FISTp $mem\t # 64-bit atomic volatile long store" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6833 opcode(0x3B);
a61af66fc99e Initial load
duke
parents:
diff changeset
6834 ins_encode( OpcP, RegMem( EAX, mem ), enc_storeL_volatile(mem,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6835 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
6836 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6837
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6838 instruct storeLX_volatile(memory mem, stackSlotL src, regD tmp, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6839 predicate(UseSSE>=2 && ((StoreLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6840 match(Set mem (StoreL mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6841 effect( TEMP tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
6842 ins_cost(380);
a61af66fc99e Initial load
duke
parents:
diff changeset
6843 format %{ "CMP $mem,EAX\t# Probe address for implicit null check\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6844 "MOVSD $tmp,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6845 "MOVSD $mem,$tmp\t # 64-bit atomic volatile long store" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6846 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6847 __ cmpl(rax, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6848 __ movdbl($tmp$$XMMRegister, Address(rsp, $src$$disp));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6849 __ movdbl($mem$$Address, $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6850 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6851 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6852 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6853
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6854 instruct storeLX_reg_volatile(memory mem, eRegL src, regD tmp2, regD tmp, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6855 predicate(UseSSE>=2 && ((StoreLNode*)n)->require_atomic_access());
a61af66fc99e Initial load
duke
parents:
diff changeset
6856 match(Set mem (StoreL mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6857 effect( TEMP tmp2 , TEMP tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
6858 ins_cost(360);
a61af66fc99e Initial load
duke
parents:
diff changeset
6859 format %{ "CMP $mem,EAX\t# Probe address for implicit null check\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6860 "MOVD $tmp,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6861 "MOVD $tmp2,$src.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6862 "PUNPCKLDQ $tmp,$tmp2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
6863 "MOVSD $mem,$tmp\t # 64-bit atomic volatile long store" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6864 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6865 __ cmpl(rax, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6866 __ movdl($tmp$$XMMRegister, $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6867 __ movdl($tmp2$$XMMRegister, HIGH_FROM_LOW($src$$Register));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6868 __ punpckldq($tmp$$XMMRegister, $tmp2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6869 __ movdbl($mem$$Address, $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6870 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6871 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6872 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6873
a61af66fc99e Initial load
duke
parents:
diff changeset
6874 // Store Pointer; for storing unknown oops and raw pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
6875 instruct storeP(memory mem, anyRegP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6876 match(Set mem (StoreP mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6877
a61af66fc99e Initial load
duke
parents:
diff changeset
6878 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
6879 format %{ "MOV $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6880 opcode(0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
6881 ins_encode( OpcP, RegMem( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
6882 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6883 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6884
a61af66fc99e Initial load
duke
parents:
diff changeset
6885 // Store Integer Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
6886 instruct storeImmI(memory mem, immI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6887 match(Set mem (StoreI mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6888
a61af66fc99e Initial load
duke
parents:
diff changeset
6889 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6890 format %{ "MOV $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6891 opcode(0xC7); /* C7 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6892 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con32( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
6893 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
6894 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6895
a61af66fc99e Initial load
duke
parents:
diff changeset
6896 // Store Short/Char Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
6897 instruct storeImmI16(memory mem, immI16 src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6898 predicate(UseStoreImmI16);
a61af66fc99e Initial load
duke
parents:
diff changeset
6899 match(Set mem (StoreC mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6900
a61af66fc99e Initial load
duke
parents:
diff changeset
6901 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6902 format %{ "MOV16 $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6903 opcode(0xC7); /* C7 /0 Same as 32 store immediate with prefix */
a61af66fc99e Initial load
duke
parents:
diff changeset
6904 ins_encode( SizePrefix, OpcP, RMopc_Mem(0x00,mem), Con16( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
6905 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
6906 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6907
a61af66fc99e Initial load
duke
parents:
diff changeset
6908 // Store Pointer Immediate; null pointers or constant oops that do not
a61af66fc99e Initial load
duke
parents:
diff changeset
6909 // need card-mark barriers.
a61af66fc99e Initial load
duke
parents:
diff changeset
6910 instruct storeImmP(memory mem, immP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6911 match(Set mem (StoreP mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6912
a61af66fc99e Initial load
duke
parents:
diff changeset
6913 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6914 format %{ "MOV $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6915 opcode(0xC7); /* C7 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6916 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con32( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
6917 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
6918 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6919
a61af66fc99e Initial load
duke
parents:
diff changeset
6920 // Store Byte Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
6921 instruct storeImmB(memory mem, immI8 src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6922 match(Set mem (StoreB mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6923
a61af66fc99e Initial load
duke
parents:
diff changeset
6924 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6925 format %{ "MOV8 $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6926 opcode(0xC6); /* C6 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6927 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con8or32( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
6928 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
6929 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6930
a61af66fc99e Initial load
duke
parents:
diff changeset
6931 // Store CMS card-mark Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
6932 instruct storeImmCM(memory mem, immI8 src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
6933 match(Set mem (StoreCM mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6934
a61af66fc99e Initial load
duke
parents:
diff changeset
6935 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
6936 format %{ "MOV8 $mem,$src\t! CMS card-mark imm0" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6937 opcode(0xC6); /* C6 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
6938 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con8or32( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
6939 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
6940 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6941
a61af66fc99e Initial load
duke
parents:
diff changeset
6942 // Store Double
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6943 instruct storeDPR( memory mem, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6944 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6945 match(Set mem (StoreD mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6946
a61af66fc99e Initial load
duke
parents:
diff changeset
6947 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6948 format %{ "FST_D $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6949 opcode(0xDD); /* DD /2 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6950 ins_encode( enc_FPR_store(mem,src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6951 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6952 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6953
a61af66fc99e Initial load
duke
parents:
diff changeset
6954 // Store double does rounding on x86
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6955 instruct storeDPR_rounded( memory mem, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6956 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6957 match(Set mem (StoreD mem (RoundDouble src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
6958
a61af66fc99e Initial load
duke
parents:
diff changeset
6959 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6960 format %{ "FST_D $mem,$src\t# round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6961 opcode(0xDD); /* DD /2 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6962 ins_encode( enc_FPR_store(mem,src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6963 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
6964 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6965
a61af66fc99e Initial load
duke
parents:
diff changeset
6966 // Store XMM register to memory (double-precision floating points)
a61af66fc99e Initial load
duke
parents:
diff changeset
6967 // MOVSD instruction
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6968 instruct storeD(memory mem, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6969 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
6970 match(Set mem (StoreD mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6971 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
6972 format %{ "MOVSD $mem,$src" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6973 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6974 __ movdbl($mem$$Address, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6975 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6976 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6977 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6978
a61af66fc99e Initial load
duke
parents:
diff changeset
6979 // Store XMM register to memory (single-precision floating point)
a61af66fc99e Initial load
duke
parents:
diff changeset
6980 // MOVSS instruction
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6981 instruct storeF(memory mem, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6982 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
6983 match(Set mem (StoreF mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6984 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
6985 format %{ "MOVSS $mem,$src" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6986 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6987 __ movflt($mem$$Address, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
6988 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6989 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
6990 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6991
a61af66fc99e Initial load
duke
parents:
diff changeset
6992 // Store Float
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
6993 instruct storeFPR( memory mem, regFPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
6994 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
6995 match(Set mem (StoreF mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
6996
a61af66fc99e Initial load
duke
parents:
diff changeset
6997 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
6998 format %{ "FST_S $mem,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
6999 opcode(0xD9); /* D9 /2 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7000 ins_encode( enc_FPR_store(mem,src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7001 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7002 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7003
a61af66fc99e Initial load
duke
parents:
diff changeset
7004 // Store Float does rounding on x86
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7005 instruct storeFPR_rounded( memory mem, regFPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7006 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7007 match(Set mem (StoreF mem (RoundFloat src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7008
a61af66fc99e Initial load
duke
parents:
diff changeset
7009 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
7010 format %{ "FST_S $mem,$src\t# round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7011 opcode(0xD9); /* D9 /2 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7012 ins_encode( enc_FPR_store(mem,src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7013 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7014 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7015
a61af66fc99e Initial load
duke
parents:
diff changeset
7016 // Store Float does rounding on x86
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7017 instruct storeFPR_Drounded( memory mem, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7018 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7019 match(Set mem (StoreF mem (ConvD2F src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7020
a61af66fc99e Initial load
duke
parents:
diff changeset
7021 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
7022 format %{ "FST_S $mem,$src\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7023 opcode(0xD9); /* D9 /2 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7024 ins_encode( enc_FPR_store(mem,src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7025 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7026 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7027
a61af66fc99e Initial load
duke
parents:
diff changeset
7028 // Store immediate Float value (it is faster than store from FPU register)
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7029 // The instruction usage is guarded by predicate in operand immFPR().
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7030 instruct storeFPR_imm( memory mem, immFPR src) %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7031 match(Set mem (StoreF mem src));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7032
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7033 ins_cost(50);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7034 format %{ "MOV $mem,$src\t# store float" %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7035 opcode(0xC7); /* C7 /0 */
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7036 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con32FPR_as_bits( src ));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7037 ins_pipe( ialu_mem_imm );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7038 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7039
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7040 // Store immediate Float value (it is faster than store from XMM register)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7041 // The instruction usage is guarded by predicate in operand immF().
a61af66fc99e Initial load
duke
parents:
diff changeset
7042 instruct storeF_imm( memory mem, immF src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7043 match(Set mem (StoreF mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7044
a61af66fc99e Initial load
duke
parents:
diff changeset
7045 ins_cost(50);
a61af66fc99e Initial load
duke
parents:
diff changeset
7046 format %{ "MOV $mem,$src\t# store float" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7047 opcode(0xC7); /* C7 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
7048 ins_encode( OpcP, RMopc_Mem(0x00,mem), Con32F_as_bits( src ));
a61af66fc99e Initial load
duke
parents:
diff changeset
7049 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
7050 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7051
a61af66fc99e Initial load
duke
parents:
diff changeset
7052 // Store Integer to stack slot
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7053 instruct storeSSI(stackSlotI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7054 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
7055
a61af66fc99e Initial load
duke
parents:
diff changeset
7056 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
7057 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7058 opcode(0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
7059 ins_encode( OpcPRegSS( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7060 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7061 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7062
a61af66fc99e Initial load
duke
parents:
diff changeset
7063 // Store Integer to stack slot
a61af66fc99e Initial load
duke
parents:
diff changeset
7064 instruct storeSSP(stackSlotP dst, eRegP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7065 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
7066
a61af66fc99e Initial load
duke
parents:
diff changeset
7067 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
7068 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7069 opcode(0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
7070 ins_encode( OpcPRegSS( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7071 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7072 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7073
a61af66fc99e Initial load
duke
parents:
diff changeset
7074 // Store Long to stack slot
a61af66fc99e Initial load
duke
parents:
diff changeset
7075 instruct storeSSL(stackSlotL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7076 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
7077
a61af66fc99e Initial load
duke
parents:
diff changeset
7078 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7079 format %{ "MOV $dst,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7080 "MOV $dst+4,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7081 opcode(0x89, 0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
7082 ins_encode( OpcP, RegMem( src, dst ), OpcS, RegMem_Hi( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7083 ins_pipe( ialu_mem_long_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7084 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7085
a61af66fc99e Initial load
duke
parents:
diff changeset
7086 //----------MemBar Instructions-----------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
7087 // Memory barrier flavors
a61af66fc99e Initial load
duke
parents:
diff changeset
7088
a61af66fc99e Initial load
duke
parents:
diff changeset
7089 instruct membar_acquire() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7090 match(MemBarAcquire);
a61af66fc99e Initial load
duke
parents:
diff changeset
7091 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
7092
a61af66fc99e Initial load
duke
parents:
diff changeset
7093 size(0);
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7094 format %{ "MEMBAR-acquire ! (empty encoding)" %}
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7095 ins_encode();
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7096 ins_pipe(empty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7097 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7098
a61af66fc99e Initial load
duke
parents:
diff changeset
7099 instruct membar_acquire_lock() %{
3849
f1c12354c3f7 7074017: Introduce MemBarAcquireLock/MemBarReleaseLock nodes for monitor enter/exit code paths
roland
parents: 3842
diff changeset
7100 match(MemBarAcquireLock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7101 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7102
a61af66fc99e Initial load
duke
parents:
diff changeset
7103 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7104 format %{ "MEMBAR-acquire (prior CMPXCHG in FastLock so empty encoding)" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7105 ins_encode( );
a61af66fc99e Initial load
duke
parents:
diff changeset
7106 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
7107 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7108
a61af66fc99e Initial load
duke
parents:
diff changeset
7109 instruct membar_release() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7110 match(MemBarRelease);
a61af66fc99e Initial load
duke
parents:
diff changeset
7111 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
7112
a61af66fc99e Initial load
duke
parents:
diff changeset
7113 size(0);
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7114 format %{ "MEMBAR-release ! (empty encoding)" %}
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7115 ins_encode( );
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7116 ins_pipe(empty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7117 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7118
a61af66fc99e Initial load
duke
parents:
diff changeset
7119 instruct membar_release_lock() %{
3849
f1c12354c3f7 7074017: Introduce MemBarAcquireLock/MemBarReleaseLock nodes for monitor enter/exit code paths
roland
parents: 3842
diff changeset
7120 match(MemBarReleaseLock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7121 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7122
a61af66fc99e Initial load
duke
parents:
diff changeset
7123 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7124 format %{ "MEMBAR-release (a FastUnlock follows so empty encoding)" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7125 ins_encode( );
a61af66fc99e Initial load
duke
parents:
diff changeset
7126 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
7127 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7128
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7129 instruct membar_volatile(eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7130 match(MemBarVolatile);
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7131 effect(KILL cr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7132 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
7133
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7134 format %{
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7135 $$template
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7136 if (os::is_MP()) {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7137 $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile"
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7138 } else {
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7139 $$emit$$"MEMBAR-volatile ! (empty encoding)"
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7140 }
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7141 %}
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7142 ins_encode %{
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7143 __ membar(Assembler::StoreLoad);
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 647
diff changeset
7144 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7145 ins_pipe(pipe_slow);
a61af66fc99e Initial load
duke
parents:
diff changeset
7146 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7147
a61af66fc99e Initial load
duke
parents:
diff changeset
7148 instruct unnecessary_membar_volatile() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7149 match(MemBarVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
7150 predicate(Matcher::post_store_load_barrier(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
7151 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7152
a61af66fc99e Initial load
duke
parents:
diff changeset
7153 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7154 format %{ "MEMBAR-volatile (unnecessary so empty encoding)" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7155 ins_encode( );
a61af66fc99e Initial load
duke
parents:
diff changeset
7156 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
7157 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7158
4763
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7159 instruct membar_storestore() %{
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7160 match(MemBarStoreStore);
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7161 ins_cost(0);
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7162
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7163 size(0);
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7164 format %{ "MEMBAR-storestore (empty encoding)" %}
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7165 ins_encode( );
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7166 ins_pipe(empty);
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7167 %}
1dc233a8c7fe 7121140: Allocation paths require explicit memory synchronization operations for RMO systems
roland
parents: 4761
diff changeset
7168
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7169 //----------Move Instructions--------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
7170 instruct castX2P(eAXRegP dst, eAXRegI src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7171 match(Set dst (CastX2P src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7172 format %{ "# X2P $dst, $src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7173 ins_encode( /*empty encoding*/ );
a61af66fc99e Initial load
duke
parents:
diff changeset
7174 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7175 ins_pipe(empty);
a61af66fc99e Initial load
duke
parents:
diff changeset
7176 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7177
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7178 instruct castP2X(rRegI dst, eRegP src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7179 match(Set dst (CastP2X src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7180 ins_cost(50);
a61af66fc99e Initial load
duke
parents:
diff changeset
7181 format %{ "MOV $dst, $src\t# CastP2X" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7182 ins_encode( enc_Copy( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7183 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7184 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7185
a61af66fc99e Initial load
duke
parents:
diff changeset
7186 //----------Conditional Move---------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
7187 // Conditional move
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7188 instruct jmovI_reg(cmpOp cop, eFlagsReg cr, rRegI dst, rRegI src) %{
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7189 predicate(!VM_Version::supports_cmov() );
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7190 match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7191 ins_cost(200);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7192 format %{ "J$cop,us skip\t# signed cmove\n\t"
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7193 "MOV $dst,$src\n"
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7194 "skip:" %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7195 ins_encode %{
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7196 Label Lskip;
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7197 // Invert sense of branch from sense of CMOV
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7198 __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7199 __ movl($dst$$Register, $src$$Register);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7200 __ bind(Lskip);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7201 %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7202 ins_pipe( pipe_cmov_reg );
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7203 %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7204
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7205 instruct jmovI_regU(cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src) %{
4047
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7206 predicate(!VM_Version::supports_cmov() );
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7207 match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7208 ins_cost(200);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7209 format %{ "J$cop,us skip\t# unsigned cmove\n\t"
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7210 "MOV $dst,$src\n"
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7211 "skip:" %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7212 ins_encode %{
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7213 Label Lskip;
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7214 // Invert sense of branch from sense of CMOV
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7215 __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7216 __ movl($dst$$Register, $src$$Register);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7217 __ bind(Lskip);
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7218 %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7219 ins_pipe( pipe_cmov_reg );
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7220 %}
d8cb48376797 7097546: Optimize use of CMOVE instructions
kvn
parents: 3854
diff changeset
7221
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7222 instruct cmovI_reg(rRegI dst, rRegI src, eFlagsReg cr, cmpOp cop ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7223 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7224 match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7225 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7226 format %{ "CMOV$cop $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7227 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7228 ins_encode( enc_cmov(cop), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7229 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7230 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7231
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7232 instruct cmovI_regU( cmpOpU cop, eFlagsRegU cr, rRegI dst, rRegI src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7233 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7234 match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7235 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7236 format %{ "CMOV$cop $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7237 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7238 ins_encode( enc_cmov(cop), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7239 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7240 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7241
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7242 instruct cmovI_regUCF( cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, rRegI src ) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7243 predicate(VM_Version::supports_cmov() );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7244 match(Set dst (CMoveI (Binary cop cr) (Binary dst src)));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7245 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7246 expand %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7247 cmovI_regU(cop, cr, dst, src);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7248 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7249 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7250
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7251 // Conditional move
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7252 instruct cmovI_mem(cmpOp cop, eFlagsReg cr, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7253 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7254 match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
7255 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
7256 format %{ "CMOV$cop $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7257 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7258 ins_encode( enc_cmov(cop), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7259 ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7260 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7261
a61af66fc99e Initial load
duke
parents:
diff changeset
7262 // Conditional move
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7263 instruct cmovI_memU(cmpOpU cop, eFlagsRegU cr, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7264 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7265 match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
7266 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
7267 format %{ "CMOV$cop $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7268 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7269 ins_encode( enc_cmov(cop), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7270 ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7271 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7272
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7273 instruct cmovI_memUCF(cmpOpUCF cop, eFlagsRegUCF cr, rRegI dst, memory src) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7274 predicate(VM_Version::supports_cmov() );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7275 match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src))));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7276 ins_cost(250);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7277 expand %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7278 cmovI_memU(cop, cr, dst, src);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7279 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7280 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7281
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7282 // Conditional move
a61af66fc99e Initial load
duke
parents:
diff changeset
7283 instruct cmovP_reg(eRegP dst, eRegP src, eFlagsReg cr, cmpOp cop ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7284 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7285 match(Set dst (CMoveP (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7286 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7287 format %{ "CMOV$cop $dst,$src\t# ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7288 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7289 ins_encode( enc_cmov(cop), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7290 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7291 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7292
a61af66fc99e Initial load
duke
parents:
diff changeset
7293 // Conditional move (non-P6 version)
a61af66fc99e Initial load
duke
parents:
diff changeset
7294 // Note: a CMoveP is generated for stubs and native wrappers
a61af66fc99e Initial load
duke
parents:
diff changeset
7295 // regardless of whether we are on a P6, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
7296 // emulate a cmov here
a61af66fc99e Initial load
duke
parents:
diff changeset
7297 instruct cmovP_reg_nonP6(eRegP dst, eRegP src, eFlagsReg cr, cmpOp cop ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7298 match(Set dst (CMoveP (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7299 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
7300 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7301 "MOV $dst,$src\t# pointer\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7302 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7303 opcode(0x8b);
a61af66fc99e Initial load
duke
parents:
diff changeset
7304 ins_encode( enc_cmov_branch(cop, 0x2), OpcP, RegReg(dst, src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7305 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7306 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7307
a61af66fc99e Initial load
duke
parents:
diff changeset
7308 // Conditional move
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7309 instruct cmovP_regU(cmpOpU cop, eFlagsRegU cr, eRegP dst, eRegP src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7310 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7311 match(Set dst (CMoveP (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7312 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7313 format %{ "CMOV$cop $dst,$src\t# ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7314 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7315 ins_encode( enc_cmov(cop), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7316 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7317 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7318
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7319 instruct cmovP_regUCF(cmpOpUCF cop, eFlagsRegUCF cr, eRegP dst, eRegP src ) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7320 predicate(VM_Version::supports_cmov() );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7321 match(Set dst (CMoveP (Binary cop cr) (Binary dst src)));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7322 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7323 expand %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7324 cmovP_regU(cop, cr, dst, src);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7325 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7326 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7327
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7328 // DISABLED: Requires the ADLC to emit a bottom_type call that
a61af66fc99e Initial load
duke
parents:
diff changeset
7329 // correctly meets the two pointer arguments; one is an incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
7330 // register but the other is a memory operand. ALSO appears to
a61af66fc99e Initial load
duke
parents:
diff changeset
7331 // be buggy with implicit null checks.
a61af66fc99e Initial load
duke
parents:
diff changeset
7332 //
a61af66fc99e Initial load
duke
parents:
diff changeset
7333 //// Conditional move
a61af66fc99e Initial load
duke
parents:
diff changeset
7334 //instruct cmovP_mem(cmpOp cop, eFlagsReg cr, eRegP dst, memory src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7335 // predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7336 // match(Set dst (CMoveP (Binary cop cr) (Binary dst (LoadP src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
7337 // ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
7338 // format %{ "CMOV$cop $dst,$src\t# ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7339 // opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7340 // ins_encode( enc_cmov(cop), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7341 // ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7342 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
7343 //
a61af66fc99e Initial load
duke
parents:
diff changeset
7344 //// Conditional move
a61af66fc99e Initial load
duke
parents:
diff changeset
7345 //instruct cmovP_memU(cmpOpU cop, eFlagsRegU cr, eRegP dst, memory src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7346 // predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7347 // match(Set dst (CMoveP (Binary cop cr) (Binary dst (LoadP src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
7348 // ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
7349 // format %{ "CMOV$cop $dst,$src\t# ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7350 // opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7351 // ins_encode( enc_cmov(cop), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7352 // ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7353 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
7354
a61af66fc99e Initial load
duke
parents:
diff changeset
7355 // Conditional move
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7356 instruct fcmovDPR_regU(cmpOp_fcmov cop, eFlagsRegU cr, regDPR1 dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7357 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7358 match(Set dst (CMoveD (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7359 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7360 format %{ "FCMOV$cop $dst,$src\t# double" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7361 opcode(0xDA);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7362 ins_encode( enc_cmov_dpr(cop,src) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7363 ins_pipe( pipe_cmovDPR_reg );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7364 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7365
a61af66fc99e Initial load
duke
parents:
diff changeset
7366 // Conditional move
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7367 instruct fcmovFPR_regU(cmpOp_fcmov cop, eFlagsRegU cr, regFPR1 dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7368 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7369 match(Set dst (CMoveF (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7370 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7371 format %{ "FCMOV$cop $dst,$src\t# float" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7372 opcode(0xDA);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7373 ins_encode( enc_cmov_dpr(cop,src) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7374 ins_pipe( pipe_cmovDPR_reg );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7375 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7376
a61af66fc99e Initial load
duke
parents:
diff changeset
7377 // Float CMOV on Intel doesn't handle *signed* compares, only unsigned.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7378 instruct fcmovDPR_regS(cmpOp cop, eFlagsReg cr, regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7379 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7380 match(Set dst (CMoveD (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7381 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7382 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7383 "MOV $dst,$src\t# double\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7384 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7385 opcode (0xdd, 0x3); /* DD D8+i or DD /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7386 ins_encode( enc_cmov_branch( cop, 0x4 ), Push_Reg_DPR(src), OpcP, RegOpc(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7387 ins_pipe( pipe_cmovDPR_reg );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7388 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7389
a61af66fc99e Initial load
duke
parents:
diff changeset
7390 // Float CMOV on Intel doesn't handle *signed* compares, only unsigned.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7391 instruct fcmovFPR_regS(cmpOp cop, eFlagsReg cr, regFPR dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7392 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7393 match(Set dst (CMoveF (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7394 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7395 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7396 "MOV $dst,$src\t# float\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7397 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7398 opcode (0xdd, 0x3); /* DD D8+i or DD /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7399 ins_encode( enc_cmov_branch( cop, 0x4 ), Push_Reg_FPR(src), OpcP, RegOpc(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7400 ins_pipe( pipe_cmovDPR_reg );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7401 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7402
a61af66fc99e Initial load
duke
parents:
diff changeset
7403 // No CMOVE with SSE/SSE2
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7404 instruct fcmovF_regS(cmpOp cop, eFlagsReg cr, regF dst, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7405 predicate (UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7406 match(Set dst (CMoveF (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7407 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7408 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7409 "MOVSS $dst,$src\t# float\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7410 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7411 ins_encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7412 Label skip;
a61af66fc99e Initial load
duke
parents:
diff changeset
7413 // Invert sense of branch from sense of CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
7414 __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7415 __ movflt($dst$$XMMRegister, $src$$XMMRegister);
a61af66fc99e Initial load
duke
parents:
diff changeset
7416 __ bind(skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7417 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7418 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
7419 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7420
a61af66fc99e Initial load
duke
parents:
diff changeset
7421 // No CMOVE with SSE/SSE2
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7422 instruct fcmovD_regS(cmpOp cop, eFlagsReg cr, regD dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7423 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7424 match(Set dst (CMoveD (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7425 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7426 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7427 "MOVSD $dst,$src\t# float\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7428 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7429 ins_encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7430 Label skip;
a61af66fc99e Initial load
duke
parents:
diff changeset
7431 // Invert sense of branch from sense of CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
7432 __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7433 __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
a61af66fc99e Initial load
duke
parents:
diff changeset
7434 __ bind(skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7435 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7436 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
7437 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7438
a61af66fc99e Initial load
duke
parents:
diff changeset
7439 // unsigned version
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7440 instruct fcmovF_regU(cmpOpU cop, eFlagsRegU cr, regF dst, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7441 predicate (UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7442 match(Set dst (CMoveF (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7443 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7444 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7445 "MOVSS $dst,$src\t# float\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7446 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7447 ins_encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7448 Label skip;
a61af66fc99e Initial load
duke
parents:
diff changeset
7449 // Invert sense of branch from sense of CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
7450 __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7451 __ movflt($dst$$XMMRegister, $src$$XMMRegister);
a61af66fc99e Initial load
duke
parents:
diff changeset
7452 __ bind(skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7453 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7454 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
7455 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7456
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7457 instruct fcmovF_regUCF(cmpOpUCF cop, eFlagsRegUCF cr, regF dst, regF src) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7458 predicate (UseSSE>=1);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7459 match(Set dst (CMoveF (Binary cop cr) (Binary dst src)));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7460 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7461 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7462 fcmovF_regU(cop, cr, dst, src);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7463 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7464 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7465
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7466 // unsigned version
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7467 instruct fcmovD_regU(cmpOpU cop, eFlagsRegU cr, regD dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7468 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7469 match(Set dst (CMoveD (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7470 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7471 format %{ "Jn$cop skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7472 "MOVSD $dst,$src\t# float\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7473 "skip:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7474 ins_encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7475 Label skip;
a61af66fc99e Initial load
duke
parents:
diff changeset
7476 // Invert sense of branch from sense of CMOV
a61af66fc99e Initial load
duke
parents:
diff changeset
7477 __ jccb((Assembler::Condition)($cop$$cmpcode^1), skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7478 __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
a61af66fc99e Initial load
duke
parents:
diff changeset
7479 __ bind(skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
7480 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7481 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
7482 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7483
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7484 instruct fcmovD_regUCF(cmpOpUCF cop, eFlagsRegUCF cr, regD dst, regD src) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7485 predicate (UseSSE>=2);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7486 match(Set dst (CMoveD (Binary cop cr) (Binary dst src)));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7487 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7488 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
7489 fcmovD_regU(cop, cr, dst, src);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7490 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7491 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7492
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7493 instruct cmovL_reg(cmpOp cop, eFlagsReg cr, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7494 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7495 match(Set dst (CMoveL (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7496 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7497 format %{ "CMOV$cop $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7498 "CMOV$cop $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7499 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7500 ins_encode( enc_cmov(cop), RegReg_Lo2( dst, src ), enc_cmov(cop), RegReg_Hi2( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7501 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
7502 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7503
a61af66fc99e Initial load
duke
parents:
diff changeset
7504 instruct cmovL_regU(cmpOpU cop, eFlagsRegU cr, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7505 predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
7506 match(Set dst (CMoveL (Binary cop cr) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7507 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
7508 format %{ "CMOV$cop $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7509 "CMOV$cop $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7510 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
7511 ins_encode( enc_cmov(cop), RegReg_Lo2( dst, src ), enc_cmov(cop), RegReg_Hi2( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7512 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
7513 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7514
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7515 instruct cmovL_regUCF(cmpOpUCF cop, eFlagsRegUCF cr, eRegL dst, eRegL src) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7516 predicate(VM_Version::supports_cmov() );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7517 match(Set dst (CMoveL (Binary cop cr) (Binary dst src)));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7518 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7519 expand %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7520 cmovL_regU(cop, cr, dst, src);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7521 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7522 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
7523
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7524 //----------Arithmetic Instructions--------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
7525 //----------Addition Instructions----------------------------------------------
12323
c9ccd7b85f20 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 10169
diff changeset
7526
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7527 instruct addExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7528 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7529 match(AddExactI dst src);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7530 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7531
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7532 format %{ "ADD $dst, $src\t# addExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7533 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7534 __ addl($dst$$Register, $src$$Register);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7535 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7536 ins_pipe(ialu_reg_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7537 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7538
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7539 instruct addExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7540 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7541 match(AddExactI dst src);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7542 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7543
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7544 format %{ "ADD $dst, $src\t# addExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7545 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7546 __ addl($dst$$Register, $src$$constant);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7547 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7548 ins_pipe(ialu_reg_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7549 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7550
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7551 instruct addExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7552 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7553 match(AddExactI dst (LoadI src));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7554 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7555
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7556 ins_cost(125);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7557 format %{ "ADD $dst,$src\t# addExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7558 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7559 __ addl($dst$$Register, $src$$Address);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7560 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7561 ins_pipe( ialu_reg_mem );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7562 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7563
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7564
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7565 // Integer Addition Instructions
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7566 instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7567 match(Set dst (AddI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7568 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7569
a61af66fc99e Initial load
duke
parents:
diff changeset
7570 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7571 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7572 opcode(0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
7573 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7574 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7575 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7576
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7577 instruct addI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7578 match(Set dst (AddI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7579 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7580
a61af66fc99e Initial load
duke
parents:
diff changeset
7581 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7582 opcode(0x81, 0x00); /* /0 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
7583 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7584 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7585 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7586
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7587 instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7588 predicate(UseIncDec);
a61af66fc99e Initial load
duke
parents:
diff changeset
7589 match(Set dst (AddI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7590 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7591
a61af66fc99e Initial load
duke
parents:
diff changeset
7592 size(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7593 format %{ "INC $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7594 opcode(0x40); /* */
a61af66fc99e Initial load
duke
parents:
diff changeset
7595 ins_encode( Opc_plus( primary, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7596 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7597 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7598
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7599 instruct leaI_eReg_immI(rRegI dst, rRegI src0, immI src1) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7600 match(Set dst (AddI src0 src1));
a61af66fc99e Initial load
duke
parents:
diff changeset
7601 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
7602
a61af66fc99e Initial load
duke
parents:
diff changeset
7603 format %{ "LEA $dst,[$src0 + $src1]" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7604 opcode(0x8D); /* 0x8D /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
7605 ins_encode( OpcP, RegLea( dst, src0, src1 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7606 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7607 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7608
a61af66fc99e Initial load
duke
parents:
diff changeset
7609 instruct leaP_eReg_immI(eRegP dst, eRegP src0, immI src1) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7610 match(Set dst (AddP src0 src1));
a61af66fc99e Initial load
duke
parents:
diff changeset
7611 ins_cost(110);
a61af66fc99e Initial load
duke
parents:
diff changeset
7612
a61af66fc99e Initial load
duke
parents:
diff changeset
7613 format %{ "LEA $dst,[$src0 + $src1]\t# ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7614 opcode(0x8D); /* 0x8D /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
7615 ins_encode( OpcP, RegLea( dst, src0, src1 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7616 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7617 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7618
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7619 instruct decI_eReg(rRegI dst, immI_M1 src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7620 predicate(UseIncDec);
a61af66fc99e Initial load
duke
parents:
diff changeset
7621 match(Set dst (AddI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7622 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7623
a61af66fc99e Initial load
duke
parents:
diff changeset
7624 size(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
7625 format %{ "DEC $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7626 opcode(0x48); /* */
a61af66fc99e Initial load
duke
parents:
diff changeset
7627 ins_encode( Opc_plus( primary, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7628 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7629 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7630
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7631 instruct addP_eReg(eRegP dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7632 match(Set dst (AddP dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7633 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7634
a61af66fc99e Initial load
duke
parents:
diff changeset
7635 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7636 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7637 opcode(0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
7638 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7639 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7640 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7641
a61af66fc99e Initial load
duke
parents:
diff changeset
7642 instruct addP_eReg_imm(eRegP dst, immI src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7643 match(Set dst (AddP dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7644 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7645
a61af66fc99e Initial load
duke
parents:
diff changeset
7646 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7647 opcode(0x81,0x00); /* Opcode 81 /0 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
7648 // ins_encode( RegImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7649 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7650 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7651 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7652
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7653 instruct addI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7654 match(Set dst (AddI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7655 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7656
a61af66fc99e Initial load
duke
parents:
diff changeset
7657 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7658 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7659 opcode(0x03);
a61af66fc99e Initial load
duke
parents:
diff changeset
7660 ins_encode( OpcP, RegMem( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7661 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7662 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7663
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7664 instruct addI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7665 match(Set dst (StoreI dst (AddI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7666 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7667
a61af66fc99e Initial load
duke
parents:
diff changeset
7668 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
7669 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7670 opcode(0x01); /* Opcode 01 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
7671 ins_encode( OpcP, RegMem( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7672 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7673 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7674
a61af66fc99e Initial load
duke
parents:
diff changeset
7675 // Add Memory with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
7676 instruct addI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7677 match(Set dst (StoreI dst (AddI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7678 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7679
a61af66fc99e Initial load
duke
parents:
diff changeset
7680 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7681 format %{ "ADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7682 opcode(0x81); /* Opcode 81 /0 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
7683 ins_encode( OpcSE( src ), RMopc_Mem(0x00,dst), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7684 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
7685 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7686
a61af66fc99e Initial load
duke
parents:
diff changeset
7687 instruct incI_mem(memory dst, immI1 src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7688 match(Set dst (StoreI dst (AddI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7689 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7690
a61af66fc99e Initial load
duke
parents:
diff changeset
7691 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7692 format %{ "INC $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7693 opcode(0xFF); /* Opcode FF /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
7694 ins_encode( OpcP, RMopc_Mem(0x00,dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7695 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
7696 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7697
a61af66fc99e Initial load
duke
parents:
diff changeset
7698 instruct decI_mem(memory dst, immI_M1 src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7699 match(Set dst (StoreI dst (AddI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7700 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7701
a61af66fc99e Initial load
duke
parents:
diff changeset
7702 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7703 format %{ "DEC $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7704 opcode(0xFF); /* Opcode FF /1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
7705 ins_encode( OpcP, RMopc_Mem(0x01,dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7706 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
7707 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7708
a61af66fc99e Initial load
duke
parents:
diff changeset
7709
a61af66fc99e Initial load
duke
parents:
diff changeset
7710 instruct checkCastPP( eRegP dst ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7711 match(Set dst (CheckCastPP dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7712
a61af66fc99e Initial load
duke
parents:
diff changeset
7713 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7714 format %{ "#checkcastPP of $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7715 ins_encode( /*empty encoding*/ );
a61af66fc99e Initial load
duke
parents:
diff changeset
7716 ins_pipe( empty );
a61af66fc99e Initial load
duke
parents:
diff changeset
7717 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7718
a61af66fc99e Initial load
duke
parents:
diff changeset
7719 instruct castPP( eRegP dst ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7720 match(Set dst (CastPP dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7721 format %{ "#castPP of $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7722 ins_encode( /*empty encoding*/ );
a61af66fc99e Initial load
duke
parents:
diff changeset
7723 ins_pipe( empty );
a61af66fc99e Initial load
duke
parents:
diff changeset
7724 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7725
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7726 instruct castII( rRegI dst ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7727 match(Set dst (CastII dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7728 format %{ "#castII of $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7729 ins_encode( /*empty encoding*/ );
a61af66fc99e Initial load
duke
parents:
diff changeset
7730 ins_cost(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
7731 ins_pipe( empty );
a61af66fc99e Initial load
duke
parents:
diff changeset
7732 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7733
a61af66fc99e Initial load
duke
parents:
diff changeset
7734
a61af66fc99e Initial load
duke
parents:
diff changeset
7735 // Load-locked - same as a regular pointer load when used with compare-swap
a61af66fc99e Initial load
duke
parents:
diff changeset
7736 instruct loadPLocked(eRegP dst, memory mem) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7737 match(Set dst (LoadPLocked mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
7738
a61af66fc99e Initial load
duke
parents:
diff changeset
7739 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7740 format %{ "MOV $dst,$mem\t# Load ptr. locked" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7741 opcode(0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
7742 ins_encode( OpcP, RegMem(dst,mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
7743 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7744 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7745
a61af66fc99e Initial load
duke
parents:
diff changeset
7746 // Conditional-store of the updated heap-top.
a61af66fc99e Initial load
duke
parents:
diff changeset
7747 // Used during allocation of the shared heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
7748 // Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel.
a61af66fc99e Initial load
duke
parents:
diff changeset
7749 instruct storePConditional( memory heap_top_ptr, eAXRegP oldval, eRegP newval, eFlagsReg cr ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
7750 match(Set cr (StorePConditional heap_top_ptr (Binary oldval newval)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7751 // EAX is killed if there is contention, but then it's also unused.
a61af66fc99e Initial load
duke
parents:
diff changeset
7752 // In the common case of no contention, EAX holds the new oop address.
a61af66fc99e Initial load
duke
parents:
diff changeset
7753 format %{ "CMPXCHG $heap_top_ptr,$newval\t# If EAX==$heap_top_ptr Then store $newval into $heap_top_ptr" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7754 ins_encode( lock_prefix, Opcode(0x0F), Opcode(0xB1), RegMem(newval,heap_top_ptr) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7755 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7756 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7757
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7758 // Conditional-store of an int value.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7759 // ZF flag is set on success, reset otherwise. Implemented with a CMPXCHG on Intel.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7760 instruct storeIConditional( memory mem, eAXRegI oldval, rRegI newval, eFlagsReg cr ) %{
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7761 match(Set cr (StoreIConditional mem (Binary oldval newval)));
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7762 effect(KILL oldval);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7763 format %{ "CMPXCHG $mem,$newval\t# If EAX==$mem Then store $newval into $mem" %}
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7764 ins_encode( lock_prefix, Opcode(0x0F), Opcode(0xB1), RegMem(newval, mem) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7765 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7766 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7767
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7768 // Conditional-store of a long value.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7769 // ZF flag is set on success, reset otherwise. Implemented with a CMPXCHG8 on Intel.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7770 instruct storeLConditional( memory mem, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7771 match(Set cr (StoreLConditional mem (Binary oldval newval)));
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7772 effect(KILL oldval);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7773 format %{ "XCHG EBX,ECX\t# correct order for CMPXCHG8 instruction\n\t"
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7774 "CMPXCHG8 $mem,ECX:EBX\t# If EDX:EAX==$mem Then store ECX:EBX into $mem\n\t"
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7775 "XCHG EBX,ECX"
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7776 %}
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7777 ins_encode %{
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7778 // Note: we need to swap rbx, and rcx before and after the
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7779 // cmpxchg8 instruction because the instruction uses
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7780 // rcx as the high order word of the new value to store but
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7781 // our register encoding uses rbx.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7782 __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc));
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7783 if( os::is_MP() )
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7784 __ lock();
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
7785 __ cmpxchg8($mem$$Address);
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7786 __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc));
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
7787 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7788 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7789 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7790
a61af66fc99e Initial load
duke
parents:
diff changeset
7791 // No flag versions for CompareAndSwap{P,I,L} because matcher can't match them
a61af66fc99e Initial load
duke
parents:
diff changeset
7792
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7793 instruct compareAndSwapL( rRegI res, eSIRegP mem_ptr, eADXRegL oldval, eBCXRegL newval, eFlagsReg cr ) %{
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7794 predicate(VM_Version::supports_cx8());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7795 match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7796 effect(KILL cr, KILL oldval);
a61af66fc99e Initial load
duke
parents:
diff changeset
7797 format %{ "CMPXCHG8 [$mem_ptr],$newval\t# If EDX:EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7798 "MOV $res,0\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7799 "JNE,s fail\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7800 "MOV $res,1\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7801 "fail:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7802 ins_encode( enc_cmpxchg8(mem_ptr),
a61af66fc99e Initial load
duke
parents:
diff changeset
7803 enc_flags_ne_to_boolean(res) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7804 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7805 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7806
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7807 instruct compareAndSwapP( rRegI res, pRegP mem_ptr, eAXRegP oldval, eCXRegP newval, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7808 match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7809 effect(KILL cr, KILL oldval);
a61af66fc99e Initial load
duke
parents:
diff changeset
7810 format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7811 "MOV $res,0\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7812 "JNE,s fail\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7813 "MOV $res,1\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7814 "fail:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7815 ins_encode( enc_cmpxchg(mem_ptr), enc_flags_ne_to_boolean(res) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7816 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7817 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7818
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7819 instruct compareAndSwapI( rRegI res, pRegP mem_ptr, eAXRegI oldval, eCXRegI newval, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7820 match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7821 effect(KILL cr, KILL oldval);
a61af66fc99e Initial load
duke
parents:
diff changeset
7822 format %{ "CMPXCHG [$mem_ptr],$newval\t# If EAX==[$mem_ptr] Then store $newval into [$mem_ptr]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7823 "MOV $res,0\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7824 "JNE,s fail\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
7825 "MOV $res,1\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
7826 "fail:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7827 ins_encode( enc_cmpxchg(mem_ptr), enc_flags_ne_to_boolean(res) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7828 ins_pipe( pipe_cmpxchg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7829 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7830
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7831 instruct xaddI_no_res( memory mem, Universe dummy, immI add, eFlagsReg cr) %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7832 predicate(n->as_LoadStore()->result_not_used());
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7833 match(Set dummy (GetAndAddI mem add));
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7834 effect(KILL cr);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7835 format %{ "ADDL [$mem],$add" %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7836 ins_encode %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7837 if (os::is_MP()) { __ lock(); }
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7838 __ addl($mem$$Address, $add$$constant);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7839 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7840 ins_pipe( pipe_cmpxchg );
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7841 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7842
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7843 instruct xaddI( memory mem, rRegI newval, eFlagsReg cr) %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7844 match(Set newval (GetAndAddI mem newval));
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7845 effect(KILL cr);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7846 format %{ "XADDL [$mem],$newval" %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7847 ins_encode %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7848 if (os::is_MP()) { __ lock(); }
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7849 __ xaddl($mem$$Address, $newval$$Register);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7850 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7851 ins_pipe( pipe_cmpxchg );
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7852 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7853
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7854 instruct xchgI( memory mem, rRegI newval) %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7855 match(Set newval (GetAndSetI mem newval));
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7856 format %{ "XCHGL $newval,[$mem]" %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7857 ins_encode %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7858 __ xchgl($newval$$Register, $mem$$Address);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7859 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7860 ins_pipe( pipe_cmpxchg );
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7861 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7862
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7863 instruct xchgP( memory mem, pRegP newval) %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7864 match(Set newval (GetAndSetP mem newval));
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7865 format %{ "XCHGL $newval,[$mem]" %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7866 ins_encode %{
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7867 __ xchgl($newval$$Register, $mem$$Address);
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7868 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7869 ins_pipe( pipe_cmpxchg );
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7870 %}
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6725
diff changeset
7871
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7872 //----------Subtraction Instructions-------------------------------------------
12972
59e8ad757e19 8026844: Various Math functions needs intrinsification
rbackman
parents: 12334
diff changeset
7873
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7874 instruct subExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7875 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7876 match(SubExactI dst src);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7877 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7878
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7879 format %{ "SUB $dst, $src\t# subExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7880 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7881 __ subl($dst$$Register, $src$$Register);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7882 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7883 ins_pipe(ialu_reg_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7884 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7885
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7886 instruct subExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7887 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7888 match(SubExactI dst src);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7889 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7890
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7891 format %{ "SUB $dst, $src\t# subExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7892 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7893 __ subl($dst$$Register, $src$$constant);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7894 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7895 ins_pipe(ialu_reg_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7896 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7897
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7898 instruct subExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7899 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7900 match(SubExactI dst (LoadI src));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7901 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7902
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7903 ins_cost(125);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7904 format %{ "SUB $dst,$src\t# subExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7905 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7906 __ subl($dst$$Register, $src$$Address);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7907 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7908 ins_pipe( ialu_reg_mem );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7909 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7910
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7911 // Integer Subtraction Instructions
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7912 instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7913 match(Set dst (SubI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7914 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7915
a61af66fc99e Initial load
duke
parents:
diff changeset
7916 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7917 format %{ "SUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7918 opcode(0x2B);
a61af66fc99e Initial load
duke
parents:
diff changeset
7919 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7920 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7921 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7922
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7923 instruct subI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7924 match(Set dst (SubI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7925 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7926
a61af66fc99e Initial load
duke
parents:
diff changeset
7927 format %{ "SUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7928 opcode(0x81,0x05); /* Opcode 81 /5 */
a61af66fc99e Initial load
duke
parents:
diff changeset
7929 // ins_encode( RegImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7930 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7931 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7932 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7933
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7934 instruct subI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7935 match(Set dst (SubI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7936 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7937
a61af66fc99e Initial load
duke
parents:
diff changeset
7938 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
7939 format %{ "SUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7940 opcode(0x2B);
a61af66fc99e Initial load
duke
parents:
diff changeset
7941 ins_encode( OpcP, RegMem( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7942 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
7943 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7944
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7945 instruct subI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7946 match(Set dst (StoreI dst (SubI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7947 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7948
a61af66fc99e Initial load
duke
parents:
diff changeset
7949 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
7950 format %{ "SUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7951 opcode(0x29); /* Opcode 29 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
7952 ins_encode( OpcP, RegMem( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7953 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7954 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7955
a61af66fc99e Initial load
duke
parents:
diff changeset
7956 // Subtract from a pointer
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7957 instruct subP_eReg(eRegP dst, rRegI src, immI0 zero, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7958 match(Set dst (AddP dst (SubI zero src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
7959 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7960
a61af66fc99e Initial load
duke
parents:
diff changeset
7961 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7962 format %{ "SUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7963 opcode(0x2B);
a61af66fc99e Initial load
duke
parents:
diff changeset
7964 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7965 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7966 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7967
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7968 instruct negI_eReg(rRegI dst, immI0 zero, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7969 match(Set dst (SubI zero dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
7970 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7971
a61af66fc99e Initial load
duke
parents:
diff changeset
7972 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
7973 format %{ "NEG $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7974 opcode(0xF7,0x03); // Opcode F7 /3
a61af66fc99e Initial load
duke
parents:
diff changeset
7975 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
7976 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
7977 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
7978
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7979 instruct negExactI_eReg(eAXRegI dst, eFlagsReg cr) %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7980 match(NegExactI dst);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7981 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7982
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7983 format %{ "NEG $dst\t# negExact int"%}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7984 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7985 __ negl($dst$$Register);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7986 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7987 ins_pipe(ialu_reg);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7988 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
7989
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7990 //----------Multiplication/Division Instructions-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
7991 // Integer Multiplication Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
7992 // Multiply Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
7993 instruct mulI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
7994 match(Set dst (MulI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
7995 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
7996
a61af66fc99e Initial load
duke
parents:
diff changeset
7997 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
7998 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
7999 format %{ "IMUL $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8000 opcode(0xAF, 0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
8001 ins_encode( OpcS, OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8002 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8003 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8004
a61af66fc99e Initial load
duke
parents:
diff changeset
8005 // Multiply 32-bit Immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8006 instruct mulI_eReg_imm(rRegI dst, rRegI src, immI imm, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8007 match(Set dst (MulI src imm));
a61af66fc99e Initial load
duke
parents:
diff changeset
8008 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8009
a61af66fc99e Initial load
duke
parents:
diff changeset
8010 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
8011 format %{ "IMUL $dst,$src,$imm" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8012 opcode(0x69); /* 69 /r id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8013 ins_encode( OpcSE(imm), RegReg( dst, src ), Con8or32( imm ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8014 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8015 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8016
a61af66fc99e Initial load
duke
parents:
diff changeset
8017 instruct loadConL_low_only(eADXRegL_low_only dst, immL32 src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8018 match(Set dst src);
a61af66fc99e Initial load
duke
parents:
diff changeset
8019 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8020
a61af66fc99e Initial load
duke
parents:
diff changeset
8021 // Note that this is artificially increased to make it more expensive than loadConL
a61af66fc99e Initial load
duke
parents:
diff changeset
8022 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
8023 format %{ "MOV EAX,$src\t// low word only" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8024 opcode(0xB8);
a61af66fc99e Initial load
duke
parents:
diff changeset
8025 ins_encode( LdImmL_Lo(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8026 ins_pipe( ialu_reg_fat );
a61af66fc99e Initial load
duke
parents:
diff changeset
8027 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8028
a61af66fc99e Initial load
duke
parents:
diff changeset
8029 // Multiply by 32-bit Immediate, taking the shifted high order results
a61af66fc99e Initial load
duke
parents:
diff changeset
8030 // (special case for shift by 32)
a61af66fc99e Initial load
duke
parents:
diff changeset
8031 instruct mulI_imm_high(eDXRegI dst, nadxRegI src1, eADXRegL_low_only src2, immI_32 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8032 match(Set dst (ConvL2I (RShiftL (MulL (ConvI2L src1) src2) cnt)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8033 predicate( _kids[0]->_kids[0]->_kids[1]->_leaf->Opcode() == Op_ConL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
8034 _kids[0]->_kids[0]->_kids[1]->_leaf->as_Type()->type()->is_long()->get_con() >= min_jint &&
a61af66fc99e Initial load
duke
parents:
diff changeset
8035 _kids[0]->_kids[0]->_kids[1]->_leaf->as_Type()->type()->is_long()->get_con() <= max_jint );
a61af66fc99e Initial load
duke
parents:
diff changeset
8036 effect(USE src1, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8037
a61af66fc99e Initial load
duke
parents:
diff changeset
8038 // Note that this is adjusted by 150 to compensate for the overcosting of loadConL_low_only
a61af66fc99e Initial load
duke
parents:
diff changeset
8039 ins_cost(0*100 + 1*400 - 150);
a61af66fc99e Initial load
duke
parents:
diff changeset
8040 format %{ "IMUL EDX:EAX,$src1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8041 ins_encode( multiply_con_and_shift_high( dst, src1, src2, cnt, cr ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8042 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8043 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8044
a61af66fc99e Initial load
duke
parents:
diff changeset
8045 // Multiply by 32-bit Immediate, taking the shifted high order results
a61af66fc99e Initial load
duke
parents:
diff changeset
8046 instruct mulI_imm_RShift_high(eDXRegI dst, nadxRegI src1, eADXRegL_low_only src2, immI_32_63 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8047 match(Set dst (ConvL2I (RShiftL (MulL (ConvI2L src1) src2) cnt)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8048 predicate( _kids[0]->_kids[0]->_kids[1]->_leaf->Opcode() == Op_ConL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
8049 _kids[0]->_kids[0]->_kids[1]->_leaf->as_Type()->type()->is_long()->get_con() >= min_jint &&
a61af66fc99e Initial load
duke
parents:
diff changeset
8050 _kids[0]->_kids[0]->_kids[1]->_leaf->as_Type()->type()->is_long()->get_con() <= max_jint );
a61af66fc99e Initial load
duke
parents:
diff changeset
8051 effect(USE src1, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8052
a61af66fc99e Initial load
duke
parents:
diff changeset
8053 // Note that this is adjusted by 150 to compensate for the overcosting of loadConL_low_only
a61af66fc99e Initial load
duke
parents:
diff changeset
8054 ins_cost(1*100 + 1*400 - 150);
a61af66fc99e Initial load
duke
parents:
diff changeset
8055 format %{ "IMUL EDX:EAX,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8056 "SAR EDX,$cnt-32" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8057 ins_encode( multiply_con_and_shift_high( dst, src1, src2, cnt, cr ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8058 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8059 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8060
a61af66fc99e Initial load
duke
parents:
diff changeset
8061 // Multiply Memory 32-bit Immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8062 instruct mulI_mem_imm(rRegI dst, memory src, immI imm, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8063 match(Set dst (MulI (LoadI src) imm));
a61af66fc99e Initial load
duke
parents:
diff changeset
8064 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8065
a61af66fc99e Initial load
duke
parents:
diff changeset
8066 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
8067 format %{ "IMUL $dst,$src,$imm" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8068 opcode(0x69); /* 69 /r id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8069 ins_encode( OpcSE(imm), RegMem( dst, src ), Con8or32( imm ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8070 ins_pipe( ialu_reg_mem_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8071 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8072
a61af66fc99e Initial load
duke
parents:
diff changeset
8073 // Multiply Memory
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8074 instruct mulI(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8075 match(Set dst (MulI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8076 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8077
a61af66fc99e Initial load
duke
parents:
diff changeset
8078 ins_cost(350);
a61af66fc99e Initial load
duke
parents:
diff changeset
8079 format %{ "IMUL $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8080 opcode(0xAF, 0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
8081 ins_encode( OpcS, OpcP, RegMem( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8082 ins_pipe( ialu_reg_mem_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8083 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8084
a61af66fc99e Initial load
duke
parents:
diff changeset
8085 // Multiply Register Int to Long
a61af66fc99e Initial load
duke
parents:
diff changeset
8086 instruct mulI2L(eADXRegL dst, eAXRegI src, nadxRegI src1, eFlagsReg flags) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8087 // Basic Idea: long = (long)int * (long)int
a61af66fc99e Initial load
duke
parents:
diff changeset
8088 match(Set dst (MulL (ConvI2L src) (ConvI2L src1)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8089 effect(DEF dst, USE src, USE src1, KILL flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
8090
a61af66fc99e Initial load
duke
parents:
diff changeset
8091 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
8092 format %{ "IMUL $dst,$src1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8093
a61af66fc99e Initial load
duke
parents:
diff changeset
8094 ins_encode( long_int_multiply( dst, src1 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8095 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8096 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8097
a61af66fc99e Initial load
duke
parents:
diff changeset
8098 instruct mulIS_eReg(eADXRegL dst, immL_32bits mask, eFlagsReg flags, eAXRegI src, nadxRegI src1) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8099 // Basic Idea: long = (int & 0xffffffffL) * (int & 0xffffffffL)
a61af66fc99e Initial load
duke
parents:
diff changeset
8100 match(Set dst (MulL (AndL (ConvI2L src) mask) (AndL (ConvI2L src1) mask)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8101 effect(KILL flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
8102
a61af66fc99e Initial load
duke
parents:
diff changeset
8103 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
8104 format %{ "MUL $dst,$src1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8105
a61af66fc99e Initial load
duke
parents:
diff changeset
8106 ins_encode( long_uint_multiply(dst, src1) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8107 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8108 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8109
a61af66fc99e Initial load
duke
parents:
diff changeset
8110 // Multiply Register Long
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8111 instruct mulL_eReg(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8112 match(Set dst (MulL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8113 effect(KILL cr, TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
8114 ins_cost(4*100+3*400);
a61af66fc99e Initial load
duke
parents:
diff changeset
8115 // Basic idea: lo(result) = lo(x_lo * y_lo)
a61af66fc99e Initial load
duke
parents:
diff changeset
8116 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
a61af66fc99e Initial load
duke
parents:
diff changeset
8117 format %{ "MOV $tmp,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8118 "IMUL $tmp,EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8119 "MOV EDX,$src.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8120 "IMUL EDX,EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8121 "ADD $tmp,EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8122 "MUL EDX:EAX,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8123 "ADD EDX,$tmp" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8124 ins_encode( long_multiply( dst, src, tmp ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8125 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8126 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8127
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8128 // Multiply Register Long where the left operand's high 32 bits are zero
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8129 instruct mulL_eReg_lhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8130 predicate(is_operand_hi32_zero(n->in(1)));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8131 match(Set dst (MulL dst src));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8132 effect(KILL cr, TEMP tmp);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8133 ins_cost(2*100+2*400);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8134 // Basic idea: lo(result) = lo(x_lo * y_lo)
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8135 // hi(result) = hi(x_lo * y_lo) + lo(x_lo * y_hi) where lo(x_hi * y_lo) = 0 because x_hi = 0
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8136 format %{ "MOV $tmp,$src.hi\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8137 "IMUL $tmp,EAX\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8138 "MUL EDX:EAX,$src.lo\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8139 "ADD EDX,$tmp" %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8140 ins_encode %{
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8141 __ movl($tmp$$Register, HIGH_FROM_LOW($src$$Register));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8142 __ imull($tmp$$Register, rax);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8143 __ mull($src$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8144 __ addl(rdx, $tmp$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8145 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8146 ins_pipe( pipe_slow );
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8147 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8148
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8149 // Multiply Register Long where the right operand's high 32 bits are zero
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8150 instruct mulL_eReg_rhi0(eADXRegL dst, eRegL src, rRegI tmp, eFlagsReg cr) %{
1209
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8151 predicate(is_operand_hi32_zero(n->in(2)));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8152 match(Set dst (MulL dst src));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8153 effect(KILL cr, TEMP tmp);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8154 ins_cost(2*100+2*400);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8155 // Basic idea: lo(result) = lo(x_lo * y_lo)
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8156 // hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) where lo(x_lo * y_hi) = 0 because y_hi = 0
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8157 format %{ "MOV $tmp,$src.lo\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8158 "IMUL $tmp,EDX\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8159 "MUL EDX:EAX,$src.lo\n\t"
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8160 "ADD EDX,$tmp" %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8161 ins_encode %{
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8162 __ movl($tmp$$Register, $src$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8163 __ imull($tmp$$Register, rdx);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8164 __ mull($src$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8165 __ addl(rdx, $tmp$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8166 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8167 ins_pipe( pipe_slow );
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8168 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8169
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8170 // Multiply Register Long where the left and the right operands' high 32 bits are zero
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8171 instruct mulL_eReg_hi0(eADXRegL dst, eRegL src, eFlagsReg cr) %{
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8172 predicate(is_operand_hi32_zero(n->in(1)) && is_operand_hi32_zero(n->in(2)));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8173 match(Set dst (MulL dst src));
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8174 effect(KILL cr);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8175 ins_cost(1*400);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8176 // Basic idea: lo(result) = lo(x_lo * y_lo)
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8177 // hi(result) = hi(x_lo * y_lo) where lo(x_hi * y_lo) = 0 and lo(x_lo * y_hi) = 0 because x_hi = 0 and y_hi = 0
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8178 format %{ "MUL EDX:EAX,$src.lo\n\t" %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8179 ins_encode %{
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8180 __ mull($src$$Register);
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8181 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8182 ins_pipe( pipe_slow );
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8183 %}
e8443c7be117 6921969: optimize 64 long multiply for case with high bits zero
never
parents: 1137
diff changeset
8184
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8185 // Multiply Register Long by small constant
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8186 instruct mulL_eReg_con(eADXRegL dst, immL_127 src, rRegI tmp, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8187 match(Set dst (MulL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8188 effect(KILL cr, TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
8189 ins_cost(2*100+2*400);
a61af66fc99e Initial load
duke
parents:
diff changeset
8190 size(12);
a61af66fc99e Initial load
duke
parents:
diff changeset
8191 // Basic idea: lo(result) = lo(src * EAX)
a61af66fc99e Initial load
duke
parents:
diff changeset
8192 // hi(result) = hi(src * EAX) + lo(src * EDX)
a61af66fc99e Initial load
duke
parents:
diff changeset
8193 format %{ "IMUL $tmp,EDX,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8194 "MOV EDX,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8195 "MUL EDX\t# EDX*EAX -> EDX:EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8196 "ADD EDX,$tmp" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8197 ins_encode( long_multiply_con( dst, src, tmp ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8198 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8199 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8200
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8201 instruct mulExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8202 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8203 match(MulExactI dst src);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8204 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8205
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8206 ins_cost(300);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8207 format %{ "IMUL $dst, $src\t# mulExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8208 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8209 __ imull($dst$$Register, $src$$Register);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8210 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8211 ins_pipe(ialu_reg_reg_alu0);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8212 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8213
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8214 instruct mulExactI_eReg_imm(eAXRegI dst, rRegI src, immI imm, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8215 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8216 match(MulExactI src imm);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8217 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8218
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8219 ins_cost(300);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8220 format %{ "IMUL $dst, $src, $imm\t# mulExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8221 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8222 __ imull($dst$$Register, $src$$Register, $imm$$constant);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8223 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8224 ins_pipe(ialu_reg_reg_alu0);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8225 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8226
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8227 instruct mulExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr)
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8228 %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8229 match(MulExactI dst (LoadI src));
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8230 effect(DEF cr);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8231
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8232 ins_cost(350);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8233 format %{ "IMUL $dst, $src\t# mulExact int" %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8234 ins_encode %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8235 __ imull($dst$$Register, $src$$Address);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8236 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8237 ins_pipe(ialu_reg_mem_alu0);
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8238 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8239
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
8240
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8241 // Integer DIV with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
8242 instruct divI_eReg(eAXRegI rax, eDXRegI rdx, eCXRegI div, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8243 match(Set rax (DivI rax div));
a61af66fc99e Initial load
duke
parents:
diff changeset
8244 effect(KILL rdx, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8245 size(26);
a61af66fc99e Initial load
duke
parents:
diff changeset
8246 ins_cost(30*100+10*100);
a61af66fc99e Initial load
duke
parents:
diff changeset
8247 format %{ "CMP EAX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8248 "JNE,s normal\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8249 "XOR EDX,EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8250 "CMP ECX,-1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8251 "JE,s done\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
8252 "normal: CDQ\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8253 "IDIV $div\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8254 "done:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8255 opcode(0xF7, 0x7); /* Opcode F7 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8256 ins_encode( cdq_enc, OpcP, RegOpc(div) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8257 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8258 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8259
a61af66fc99e Initial load
duke
parents:
diff changeset
8260 // Divide Register Long
a61af66fc99e Initial load
duke
parents:
diff changeset
8261 instruct divL_eReg( eADXRegL dst, eRegL src1, eRegL src2, eFlagsReg cr, eCXRegI cx, eBXRegI bx ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8262 match(Set dst (DivL src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
8263 effect( KILL cr, KILL cx, KILL bx );
a61af66fc99e Initial load
duke
parents:
diff changeset
8264 ins_cost(10000);
a61af66fc99e Initial load
duke
parents:
diff changeset
8265 format %{ "PUSH $src1.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8266 "PUSH $src1.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8267 "PUSH $src2.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8268 "PUSH $src2.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8269 "CALL SharedRuntime::ldiv\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8270 "ADD ESP,16" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8271 ins_encode( long_div(src1,src2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8272 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8273 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8274
a61af66fc99e Initial load
duke
parents:
diff changeset
8275 // Integer DIVMOD with Register, both quotient and mod results
a61af66fc99e Initial load
duke
parents:
diff changeset
8276 instruct divModI_eReg_divmod(eAXRegI rax, eDXRegI rdx, eCXRegI div, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8277 match(DivModI rax div);
a61af66fc99e Initial load
duke
parents:
diff changeset
8278 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8279 size(26);
a61af66fc99e Initial load
duke
parents:
diff changeset
8280 ins_cost(30*100+10*100);
a61af66fc99e Initial load
duke
parents:
diff changeset
8281 format %{ "CMP EAX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8282 "JNE,s normal\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8283 "XOR EDX,EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8284 "CMP ECX,-1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8285 "JE,s done\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
8286 "normal: CDQ\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8287 "IDIV $div\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8288 "done:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8289 opcode(0xF7, 0x7); /* Opcode F7 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8290 ins_encode( cdq_enc, OpcP, RegOpc(div) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8291 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8292 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8293
a61af66fc99e Initial load
duke
parents:
diff changeset
8294 // Integer MOD with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
8295 instruct modI_eReg(eDXRegI rdx, eAXRegI rax, eCXRegI div, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8296 match(Set rdx (ModI rax div));
a61af66fc99e Initial load
duke
parents:
diff changeset
8297 effect(KILL rax, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8298
a61af66fc99e Initial load
duke
parents:
diff changeset
8299 size(26);
a61af66fc99e Initial load
duke
parents:
diff changeset
8300 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
8301 format %{ "CDQ\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8302 "IDIV $div" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8303 opcode(0xF7, 0x7); /* Opcode F7 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8304 ins_encode( cdq_enc, OpcP, RegOpc(div) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8305 ins_pipe( ialu_reg_reg_alu0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
8306 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8307
a61af66fc99e Initial load
duke
parents:
diff changeset
8308 // Remainder Register Long
a61af66fc99e Initial load
duke
parents:
diff changeset
8309 instruct modL_eReg( eADXRegL dst, eRegL src1, eRegL src2, eFlagsReg cr, eCXRegI cx, eBXRegI bx ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8310 match(Set dst (ModL src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
8311 effect( KILL cr, KILL cx, KILL bx );
a61af66fc99e Initial load
duke
parents:
diff changeset
8312 ins_cost(10000);
a61af66fc99e Initial load
duke
parents:
diff changeset
8313 format %{ "PUSH $src1.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8314 "PUSH $src1.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8315 "PUSH $src2.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8316 "PUSH $src2.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8317 "CALL SharedRuntime::lrem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8318 "ADD ESP,16" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8319 ins_encode( long_mod(src1,src2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8320 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
8321 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8322
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8323 // Divide Register Long (no special case since divisor != -1)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8324 instruct divL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8325 match(Set dst (DivL dst imm));
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8326 effect( TEMP tmp, TEMP tmp2, KILL cr );
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8327 ins_cost(1000);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8328 format %{ "MOV $tmp,abs($imm) # ldiv EDX:EAX,$imm\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8329 "XOR $tmp2,$tmp2\n\t"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8330 "CMP $tmp,EDX\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8331 "JA,s fast\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8332 "MOV $tmp2,EAX\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8333 "MOV EAX,EDX\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8334 "MOV EDX,0\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8335 "JLE,s pos\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8336 "LNEG EAX : $tmp2\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8337 "DIV $tmp # unsigned division\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8338 "XCHG EAX,$tmp2\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8339 "DIV $tmp\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8340 "LNEG $tmp2 : EAX\n\t"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8341 "JMP,s done\n"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8342 "pos:\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8343 "DIV $tmp\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8344 "XCHG EAX,$tmp2\n"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8345 "fast:\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8346 "DIV $tmp\n"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8347 "done:\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8348 "MOV EDX,$tmp2\n\t"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8349 "NEG EDX:EAX # if $imm < 0" %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8350 ins_encode %{
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8351 int con = (int)$imm$$constant;
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8352 assert(con != 0 && con != -1 && con != min_jint, "wrong divisor");
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8353 int pcon = (con > 0) ? con : -con;
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8354 Label Lfast, Lpos, Ldone;
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8355
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8356 __ movl($tmp$$Register, pcon);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8357 __ xorl($tmp2$$Register,$tmp2$$Register);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8358 __ cmpl($tmp$$Register, HIGH_FROM_LOW($dst$$Register));
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8359 __ jccb(Assembler::above, Lfast); // result fits into 32 bit
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8360
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8361 __ movl($tmp2$$Register, $dst$$Register); // save
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8362 __ movl($dst$$Register, HIGH_FROM_LOW($dst$$Register));
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8363 __ movl(HIGH_FROM_LOW($dst$$Register),0); // preserve flags
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8364 __ jccb(Assembler::lessEqual, Lpos); // result is positive
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8365
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8366 // Negative dividend.
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8367 // convert value to positive to use unsigned division
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8368 __ lneg($dst$$Register, $tmp2$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8369 __ divl($tmp$$Register);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8370 __ xchgl($dst$$Register, $tmp2$$Register);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8371 __ divl($tmp$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8372 // revert result back to negative
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8373 __ lneg($tmp2$$Register, $dst$$Register);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8374 __ jmpb(Ldone);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8375
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8376 __ bind(Lpos);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8377 __ divl($tmp$$Register); // Use unsigned division
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8378 __ xchgl($dst$$Register, $tmp2$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8379 // Fallthrow for final divide, tmp2 has 32 bit hi result
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8380
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8381 __ bind(Lfast);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8382 // fast path: src is positive
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8383 __ divl($tmp$$Register); // Use unsigned division
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8384
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8385 __ bind(Ldone);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8386 __ movl(HIGH_FROM_LOW($dst$$Register),$tmp2$$Register);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8387 if (con < 0) {
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8388 __ lneg(HIGH_FROM_LOW($dst$$Register), $dst$$Register);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8389 }
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8390 %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8391 ins_pipe( pipe_slow );
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8392 %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8393
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8394 // Remainder Register Long (remainder fit into 32 bits)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8395 instruct modL_eReg_imm32( eADXRegL dst, immL32 imm, rRegI tmp, rRegI tmp2, eFlagsReg cr ) %{
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8396 match(Set dst (ModL dst imm));
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8397 effect( TEMP tmp, TEMP tmp2, KILL cr );
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8398 ins_cost(1000);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8399 format %{ "MOV $tmp,abs($imm) # lrem EDX:EAX,$imm\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8400 "CMP $tmp,EDX\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8401 "JA,s fast\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8402 "MOV $tmp2,EAX\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8403 "MOV EAX,EDX\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8404 "MOV EDX,0\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8405 "JLE,s pos\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8406 "LNEG EAX : $tmp2\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8407 "DIV $tmp # unsigned division\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8408 "MOV EAX,$tmp2\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8409 "DIV $tmp\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8410 "NEG EDX\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8411 "JMP,s done\n"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8412 "pos:\n\t"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8413 "DIV $tmp\n\t"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8414 "MOV EAX,$tmp2\n"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8415 "fast:\n\t"
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8416 "DIV $tmp\n"
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8417 "done:\n\t"
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8418 "MOV EAX,EDX\n\t"
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8419 "SAR EDX,31\n\t" %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8420 ins_encode %{
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8421 int con = (int)$imm$$constant;
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8422 assert(con != 0 && con != -1 && con != min_jint, "wrong divisor");
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8423 int pcon = (con > 0) ? con : -con;
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8424 Label Lfast, Lpos, Ldone;
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8425
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8426 __ movl($tmp$$Register, pcon);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8427 __ cmpl($tmp$$Register, HIGH_FROM_LOW($dst$$Register));
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8428 __ jccb(Assembler::above, Lfast); // src is positive and result fits into 32 bit
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8429
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8430 __ movl($tmp2$$Register, $dst$$Register); // save
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8431 __ movl($dst$$Register, HIGH_FROM_LOW($dst$$Register));
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8432 __ movl(HIGH_FROM_LOW($dst$$Register),0); // preserve flags
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8433 __ jccb(Assembler::lessEqual, Lpos); // result is positive
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8434
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8435 // Negative dividend.
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8436 // convert value to positive to use unsigned division
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8437 __ lneg($dst$$Register, $tmp2$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8438 __ divl($tmp$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8439 __ movl($dst$$Register, $tmp2$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8440 __ divl($tmp$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8441 // revert remainder back to negative
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8442 __ negl(HIGH_FROM_LOW($dst$$Register));
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8443 __ jmpb(Ldone);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8444
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8445 __ bind(Lpos);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8446 __ divl($tmp$$Register);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8447 __ movl($dst$$Register, $tmp2$$Register);
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8448
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8449 __ bind(Lfast);
1920
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8450 // fast path: src is positive
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8451 __ divl($tmp$$Register);
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8452
2fe998383789 6997311: SIGFPE in new long division asm code
kvn
parents: 1914
diff changeset
8453 __ bind(Ldone);
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8454 __ movl($dst$$Register, HIGH_FROM_LOW($dst$$Register));
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8455 __ sarl(HIGH_FROM_LOW($dst$$Register), 31); // result sign
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8456
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8457 %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8458 ins_pipe( pipe_slow );
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8459 %}
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1748
diff changeset
8460
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8461 // Integer Shift Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
8462 // Shift Left by one
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8463 instruct shlI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8464 match(Set dst (LShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8465 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8466
a61af66fc99e Initial load
duke
parents:
diff changeset
8467 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8468 format %{ "SHL $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8469 opcode(0xD1, 0x4); /* D1 /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8470 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8471 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8472 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8473
a61af66fc99e Initial load
duke
parents:
diff changeset
8474 // Shift Left by 8-bit immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8475 instruct salI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8476 match(Set dst (LShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8477 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8478
a61af66fc99e Initial load
duke
parents:
diff changeset
8479 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
8480 format %{ "SHL $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8481 opcode(0xC1, 0x4); /* C1 /4 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
8482 ins_encode( RegOpcImm( dst, shift) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8483 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8484 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8485
a61af66fc99e Initial load
duke
parents:
diff changeset
8486 // Shift Left by variable
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8487 instruct salI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8488 match(Set dst (LShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8489 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8490
a61af66fc99e Initial load
duke
parents:
diff changeset
8491 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8492 format %{ "SHL $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8493 opcode(0xD3, 0x4); /* D3 /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8494 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8495 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8496 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8497
a61af66fc99e Initial load
duke
parents:
diff changeset
8498 // Arithmetic shift right by one
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8499 instruct sarI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8500 match(Set dst (RShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8501 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8502
a61af66fc99e Initial load
duke
parents:
diff changeset
8503 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8504 format %{ "SAR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8505 opcode(0xD1, 0x7); /* D1 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8506 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8507 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8508 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8509
a61af66fc99e Initial load
duke
parents:
diff changeset
8510 // Arithmetic shift right by one
a61af66fc99e Initial load
duke
parents:
diff changeset
8511 instruct sarI_mem_1(memory dst, immI1 shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8512 match(Set dst (StoreI dst (RShiftI (LoadI dst) shift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8513 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8514 format %{ "SAR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8515 opcode(0xD1, 0x7); /* D1 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8516 ins_encode( OpcP, RMopc_Mem(secondary,dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8517 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8518 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8519
a61af66fc99e Initial load
duke
parents:
diff changeset
8520 // Arithmetic Shift Right by 8-bit immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8521 instruct sarI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8522 match(Set dst (RShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8523 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8524
a61af66fc99e Initial load
duke
parents:
diff changeset
8525 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
8526 format %{ "SAR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8527 opcode(0xC1, 0x7); /* C1 /7 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
8528 ins_encode( RegOpcImm( dst, shift ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8529 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8530 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8531
a61af66fc99e Initial load
duke
parents:
diff changeset
8532 // Arithmetic Shift Right by 8-bit immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
8533 instruct sarI_mem_imm(memory dst, immI8 shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8534 match(Set dst (StoreI dst (RShiftI (LoadI dst) shift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8535 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8536
a61af66fc99e Initial load
duke
parents:
diff changeset
8537 format %{ "SAR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8538 opcode(0xC1, 0x7); /* C1 /7 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
8539 ins_encode( OpcP, RMopc_Mem(secondary, dst ), Con8or32( shift ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8540 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8541 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8542
a61af66fc99e Initial load
duke
parents:
diff changeset
8543 // Arithmetic Shift Right by variable
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8544 instruct sarI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8545 match(Set dst (RShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8546 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8547
a61af66fc99e Initial load
duke
parents:
diff changeset
8548 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8549 format %{ "SAR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8550 opcode(0xD3, 0x7); /* D3 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8551 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8552 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8553 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8554
a61af66fc99e Initial load
duke
parents:
diff changeset
8555 // Logical shift right by one
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8556 instruct shrI_eReg_1(rRegI dst, immI1 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8557 match(Set dst (URShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8558 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8559
a61af66fc99e Initial load
duke
parents:
diff changeset
8560 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8561 format %{ "SHR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8562 opcode(0xD1, 0x5); /* D1 /5 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8563 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8564 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8565 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8566
a61af66fc99e Initial load
duke
parents:
diff changeset
8567 // Logical Shift Right by 8-bit immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8568 instruct shrI_eReg_imm(rRegI dst, immI8 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8569 match(Set dst (URShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8570 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8571
a61af66fc99e Initial load
duke
parents:
diff changeset
8572 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
8573 format %{ "SHR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8574 opcode(0xC1, 0x5); /* C1 /5 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
8575 ins_encode( RegOpcImm( dst, shift) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8576 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8577 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8578
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8579
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8580 // Logical Shift Right by 24, followed by Arithmetic Shift Left by 24.
a61af66fc99e Initial load
duke
parents:
diff changeset
8581 // This idiom is used by the compiler for the i2b bytecode.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8582 instruct i2b(rRegI dst, xRegI src, immI_24 twentyfour) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8583 match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour));
a61af66fc99e Initial load
duke
parents:
diff changeset
8584
a61af66fc99e Initial load
duke
parents:
diff changeset
8585 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
8586 format %{ "MOVSX $dst,$src :8" %}
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8587 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8588 __ movsbl($dst$$Register, $src$$Register);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8589 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8590 ins_pipe(ialu_reg_reg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8591 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8592
a61af66fc99e Initial load
duke
parents:
diff changeset
8593 // Logical Shift Right by 16, followed by Arithmetic Shift Left by 16.
a61af66fc99e Initial load
duke
parents:
diff changeset
8594 // This idiom is used by the compiler the i2s bytecode.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8595 instruct i2s(rRegI dst, xRegI src, immI_16 sixteen) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8596 match(Set dst (RShiftI (LShiftI src sixteen) sixteen));
a61af66fc99e Initial load
duke
parents:
diff changeset
8597
a61af66fc99e Initial load
duke
parents:
diff changeset
8598 size(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
8599 format %{ "MOVSX $dst,$src :16" %}
785
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8600 ins_encode %{
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8601 __ movswl($dst$$Register, $src$$Register);
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8602 %}
2056494941db 6814842: Load shortening optimizations
twisti
parents: 775
diff changeset
8603 ins_pipe(ialu_reg_reg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8604 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8605
a61af66fc99e Initial load
duke
parents:
diff changeset
8606
a61af66fc99e Initial load
duke
parents:
diff changeset
8607 // Logical Shift Right by variable
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8608 instruct shrI_eReg_CL(rRegI dst, eCXRegI shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8609 match(Set dst (URShiftI dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
8610 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8611
a61af66fc99e Initial load
duke
parents:
diff changeset
8612 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8613 format %{ "SHR $dst,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8614 opcode(0xD3, 0x5); /* D3 /5 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8615 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8616 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8617 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8618
a61af66fc99e Initial load
duke
parents:
diff changeset
8619
a61af66fc99e Initial load
duke
parents:
diff changeset
8620 //----------Logical Instructions-----------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
8621 //----------Integer Logical Instructions---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
8622 // And Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
8623 // And Register with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8624 instruct andI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8625 match(Set dst (AndI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8626 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8627
a61af66fc99e Initial load
duke
parents:
diff changeset
8628 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8629 format %{ "AND $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8630 opcode(0x23);
a61af66fc99e Initial load
duke
parents:
diff changeset
8631 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8632 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8633 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8634
a61af66fc99e Initial load
duke
parents:
diff changeset
8635 // And Register with Immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8636 instruct andI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8637 match(Set dst (AndI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8638 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8639
a61af66fc99e Initial load
duke
parents:
diff changeset
8640 format %{ "AND $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8641 opcode(0x81,0x04); /* Opcode 81 /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8642 // ins_encode( RegImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8643 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8644 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8645 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8646
a61af66fc99e Initial load
duke
parents:
diff changeset
8647 // And Register with Memory
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8648 instruct andI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8649 match(Set dst (AndI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8650 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8651
a61af66fc99e Initial load
duke
parents:
diff changeset
8652 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8653 format %{ "AND $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8654 opcode(0x23);
a61af66fc99e Initial load
duke
parents:
diff changeset
8655 ins_encode( OpcP, RegMem( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8656 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
8657 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8658
a61af66fc99e Initial load
duke
parents:
diff changeset
8659 // And Memory with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8660 instruct andI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8661 match(Set dst (StoreI dst (AndI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8662 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8663
a61af66fc99e Initial load
duke
parents:
diff changeset
8664 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
8665 format %{ "AND $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8666 opcode(0x21); /* Opcode 21 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
8667 ins_encode( OpcP, RegMem( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8668 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8669 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8670
a61af66fc99e Initial load
duke
parents:
diff changeset
8671 // And Memory with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
8672 instruct andI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8673 match(Set dst (StoreI dst (AndI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8674 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8675
a61af66fc99e Initial load
duke
parents:
diff changeset
8676 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8677 format %{ "AND $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8678 opcode(0x81, 0x4); /* Opcode 81 /4 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8679 // ins_encode( MemImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8680 ins_encode( OpcSE( src ), RMopc_Mem(secondary, dst ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8681 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8682 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8683
a61af66fc99e Initial load
duke
parents:
diff changeset
8684 // Or Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
8685 // Or Register with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8686 instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8687 match(Set dst (OrI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8688 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8689
a61af66fc99e Initial load
duke
parents:
diff changeset
8690 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8691 format %{ "OR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8692 opcode(0x0B);
a61af66fc99e Initial load
duke
parents:
diff changeset
8693 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8694 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8695 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8696
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8697 instruct orI_eReg_castP2X(rRegI dst, eRegP src, eFlagsReg cr) %{
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8698 match(Set dst (OrI dst (CastP2X src)));
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8699 effect(KILL cr);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8700
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8701 size(2);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8702 format %{ "OR $dst,$src" %}
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8703 opcode(0x0B);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8704 ins_encode( OpcP, RegReg( dst, src) );
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8705 ins_pipe( ialu_reg_reg );
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8706 %}
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8707
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 415
diff changeset
8708
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8709 // Or Register with Immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8710 instruct orI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8711 match(Set dst (OrI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8712 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8713
a61af66fc99e Initial load
duke
parents:
diff changeset
8714 format %{ "OR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8715 opcode(0x81,0x01); /* Opcode 81 /1 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8716 // ins_encode( RegImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8717 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8718 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8719 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8720
a61af66fc99e Initial load
duke
parents:
diff changeset
8721 // Or Register with Memory
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8722 instruct orI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8723 match(Set dst (OrI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8724 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8725
a61af66fc99e Initial load
duke
parents:
diff changeset
8726 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8727 format %{ "OR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8728 opcode(0x0B);
a61af66fc99e Initial load
duke
parents:
diff changeset
8729 ins_encode( OpcP, RegMem( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8730 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
8731 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8732
a61af66fc99e Initial load
duke
parents:
diff changeset
8733 // Or Memory with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8734 instruct orI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8735 match(Set dst (StoreI dst (OrI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8736 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8737
a61af66fc99e Initial load
duke
parents:
diff changeset
8738 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
8739 format %{ "OR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8740 opcode(0x09); /* Opcode 09 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
8741 ins_encode( OpcP, RegMem( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8742 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8743 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8744
a61af66fc99e Initial load
duke
parents:
diff changeset
8745 // Or Memory with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
8746 instruct orI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8747 match(Set dst (StoreI dst (OrI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8748 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8749
a61af66fc99e Initial load
duke
parents:
diff changeset
8750 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8751 format %{ "OR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8752 opcode(0x81,0x1); /* Opcode 81 /1 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8753 // ins_encode( MemImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8754 ins_encode( OpcSE( src ), RMopc_Mem(secondary, dst ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8755 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8756 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8757
a61af66fc99e Initial load
duke
parents:
diff changeset
8758 // ROL/ROR
a61af66fc99e Initial load
duke
parents:
diff changeset
8759 // ROL expand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8760 instruct rolI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8761 effect(USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8762
a61af66fc99e Initial load
duke
parents:
diff changeset
8763 format %{ "ROL $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8764 opcode(0xD1, 0x0); /* Opcode D1 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8765 ins_encode( OpcP, RegOpc( dst ));
a61af66fc99e Initial load
duke
parents:
diff changeset
8766 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8767 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8768
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8769 instruct rolI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8770 effect(USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8771
a61af66fc99e Initial load
duke
parents:
diff changeset
8772 format %{ "ROL $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8773 opcode(0xC1, 0x0); /*Opcode /C1 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8774 ins_encode( RegOpcImm(dst, shift) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8775 ins_pipe(ialu_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
8776 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8777
a61af66fc99e Initial load
duke
parents:
diff changeset
8778 instruct rolI_eReg_CL(ncxRegI dst, eCXRegI shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8779 effect(USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8780
a61af66fc99e Initial load
duke
parents:
diff changeset
8781 format %{ "ROL $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8782 opcode(0xD3, 0x0); /* Opcode D3 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8783 ins_encode(OpcP, RegOpc(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
8784 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8785 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8786 // end of ROL expand
a61af66fc99e Initial load
duke
parents:
diff changeset
8787
a61af66fc99e Initial load
duke
parents:
diff changeset
8788 // ROL 32bit by one once
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8789 instruct rolI_eReg_i1(rRegI dst, immI1 lshift, immI_M1 rshift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8790 match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8791
a61af66fc99e Initial load
duke
parents:
diff changeset
8792 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8793 rolI_eReg_imm1(dst, lshift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8794 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8795 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8796
a61af66fc99e Initial load
duke
parents:
diff changeset
8797 // ROL 32bit var by imm8 once
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8798 instruct rolI_eReg_i8(rRegI dst, immI8 lshift, immI8 rshift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8799 predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
a61af66fc99e Initial load
duke
parents:
diff changeset
8800 match(Set dst ( OrI (LShiftI dst lshift) (URShiftI dst rshift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8801
a61af66fc99e Initial load
duke
parents:
diff changeset
8802 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8803 rolI_eReg_imm8(dst, lshift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8804 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8805 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8806
a61af66fc99e Initial load
duke
parents:
diff changeset
8807 // ROL 32bit var by var once
a61af66fc99e Initial load
duke
parents:
diff changeset
8808 instruct rolI_eReg_Var_C0(ncxRegI dst, eCXRegI shift, immI0 zero, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8809 match(Set dst ( OrI (LShiftI dst shift) (URShiftI dst (SubI zero shift))));
a61af66fc99e Initial load
duke
parents:
diff changeset
8810
a61af66fc99e Initial load
duke
parents:
diff changeset
8811 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8812 rolI_eReg_CL(dst, shift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8813 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8814 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8815
a61af66fc99e Initial load
duke
parents:
diff changeset
8816 // ROL 32bit var by var once
a61af66fc99e Initial load
duke
parents:
diff changeset
8817 instruct rolI_eReg_Var_C32(ncxRegI dst, eCXRegI shift, immI_32 c32, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8818 match(Set dst ( OrI (LShiftI dst shift) (URShiftI dst (SubI c32 shift))));
a61af66fc99e Initial load
duke
parents:
diff changeset
8819
a61af66fc99e Initial load
duke
parents:
diff changeset
8820 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8821 rolI_eReg_CL(dst, shift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8822 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8823 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8824
a61af66fc99e Initial load
duke
parents:
diff changeset
8825 // ROR expand
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8826 instruct rorI_eReg_imm1(rRegI dst, immI1 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8827 effect(USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8828
a61af66fc99e Initial load
duke
parents:
diff changeset
8829 format %{ "ROR $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8830 opcode(0xD1,0x1); /* Opcode D1 /1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8831 ins_encode( OpcP, RegOpc( dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8832 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8833 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8834
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8835 instruct rorI_eReg_imm8(rRegI dst, immI8 shift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8836 effect (USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8837
a61af66fc99e Initial load
duke
parents:
diff changeset
8838 format %{ "ROR $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8839 opcode(0xC1, 0x1); /* Opcode /C1 /1 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
8840 ins_encode( RegOpcImm(dst, shift) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8841 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8842 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8843
a61af66fc99e Initial load
duke
parents:
diff changeset
8844 instruct rorI_eReg_CL(ncxRegI dst, eCXRegI shift, eFlagsReg cr)%{
a61af66fc99e Initial load
duke
parents:
diff changeset
8845 effect(USE_DEF dst, USE shift, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8846
a61af66fc99e Initial load
duke
parents:
diff changeset
8847 format %{ "ROR $dst, $shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8848 opcode(0xD3, 0x1); /* Opcode D3 /1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
8849 ins_encode(OpcP, RegOpc(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
8850 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8851 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8852 // end of ROR expand
a61af66fc99e Initial load
duke
parents:
diff changeset
8853
a61af66fc99e Initial load
duke
parents:
diff changeset
8854 // ROR right once
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8855 instruct rorI_eReg_i1(rRegI dst, immI1 rshift, immI_M1 lshift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8856 match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8857
a61af66fc99e Initial load
duke
parents:
diff changeset
8858 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8859 rorI_eReg_imm1(dst, rshift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8860 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8861 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8862
a61af66fc99e Initial load
duke
parents:
diff changeset
8863 // ROR 32bit by immI8 once
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8864 instruct rorI_eReg_i8(rRegI dst, immI8 rshift, immI8 lshift, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8865 predicate( 0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
a61af66fc99e Initial load
duke
parents:
diff changeset
8866 match(Set dst ( OrI (URShiftI dst rshift) (LShiftI dst lshift)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8867
a61af66fc99e Initial load
duke
parents:
diff changeset
8868 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8869 rorI_eReg_imm8(dst, rshift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8870 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8871 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8872
a61af66fc99e Initial load
duke
parents:
diff changeset
8873 // ROR 32bit var by var once
a61af66fc99e Initial load
duke
parents:
diff changeset
8874 instruct rorI_eReg_Var_C0(ncxRegI dst, eCXRegI shift, immI0 zero, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8875 match(Set dst ( OrI (URShiftI dst shift) (LShiftI dst (SubI zero shift))));
a61af66fc99e Initial load
duke
parents:
diff changeset
8876
a61af66fc99e Initial load
duke
parents:
diff changeset
8877 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8878 rorI_eReg_CL(dst, shift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8879 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8880 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8881
a61af66fc99e Initial load
duke
parents:
diff changeset
8882 // ROR 32bit var by var once
a61af66fc99e Initial load
duke
parents:
diff changeset
8883 instruct rorI_eReg_Var_C32(ncxRegI dst, eCXRegI shift, immI_32 c32, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8884 match(Set dst ( OrI (URShiftI dst shift) (LShiftI dst (SubI c32 shift))));
a61af66fc99e Initial load
duke
parents:
diff changeset
8885
a61af66fc99e Initial load
duke
parents:
diff changeset
8886 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8887 rorI_eReg_CL(dst, shift, cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8888 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8889 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8890
a61af66fc99e Initial load
duke
parents:
diff changeset
8891 // Xor Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
8892 // Xor Register with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8893 instruct xorI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8894 match(Set dst (XorI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8895 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8896
a61af66fc99e Initial load
duke
parents:
diff changeset
8897 size(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
8898 format %{ "XOR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8899 opcode(0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
8900 ins_encode( OpcP, RegReg( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8901 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8902 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8903
403
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8904 // Xor Register with Immediate -1
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8905 instruct xorI_eReg_im1(rRegI dst, immI_M1 imm) %{
403
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8906 match(Set dst (XorI dst imm));
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8907
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8908 size(2);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8909 format %{ "NOT $dst" %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8910 ins_encode %{
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8911 __ notl($dst$$Register);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8912 %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8913 ins_pipe( ialu_reg );
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8914 %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
8915
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8916 // Xor Register with Immediate
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8917 instruct xorI_eReg_imm(rRegI dst, immI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8918 match(Set dst (XorI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8919 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8920
a61af66fc99e Initial load
duke
parents:
diff changeset
8921 format %{ "XOR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8922 opcode(0x81,0x06); /* Opcode 81 /6 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8923 // ins_encode( RegImm( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8924 ins_encode( OpcSErm( dst, src ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8925 ins_pipe( ialu_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8926 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8927
a61af66fc99e Initial load
duke
parents:
diff changeset
8928 // Xor Register with Memory
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8929 instruct xorI_eReg_mem(rRegI dst, memory src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8930 match(Set dst (XorI dst (LoadI src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8931 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8932
a61af66fc99e Initial load
duke
parents:
diff changeset
8933 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8934 format %{ "XOR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8935 opcode(0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
8936 ins_encode( OpcP, RegMem(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8937 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
8938 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8939
a61af66fc99e Initial load
duke
parents:
diff changeset
8940 // Xor Memory with Register
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8941 instruct xorI_mem_eReg(memory dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8942 match(Set dst (StoreI dst (XorI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8943 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8944
a61af66fc99e Initial load
duke
parents:
diff changeset
8945 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
8946 format %{ "XOR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8947 opcode(0x31); /* Opcode 31 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
8948 ins_encode( OpcP, RegMem( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8949 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8950 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8951
a61af66fc99e Initial load
duke
parents:
diff changeset
8952 // Xor Memory with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
8953 instruct xorI_mem_imm(memory dst, immI src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8954 match(Set dst (StoreI dst (XorI (LoadI dst) src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
8955 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8956
a61af66fc99e Initial load
duke
parents:
diff changeset
8957 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
8958 format %{ "XOR $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8959 opcode(0x81,0x6); /* Opcode 81 /6 id */
a61af66fc99e Initial load
duke
parents:
diff changeset
8960 ins_encode( OpcSE( src ), RMopc_Mem(secondary, dst ), Con8or32( src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8961 ins_pipe( ialu_mem_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
8962 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8963
a61af66fc99e Initial load
duke
parents:
diff changeset
8964 //----------Convert Int to Boolean---------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
8965
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8966 instruct movI_nocopy(rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8967 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
8968 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8969 ins_encode( enc_Copy( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8970 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8971 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8972
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8973 instruct ci2b( rRegI dst, rRegI src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8974 effect( USE_DEF dst, USE src, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
8975
a61af66fc99e Initial load
duke
parents:
diff changeset
8976 size(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
8977 format %{ "NEG $dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
8978 "ADC $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8979 ins_encode( neg_reg(dst),
a61af66fc99e Initial load
duke
parents:
diff changeset
8980 OpcRegReg(0x13,dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8981 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
8982 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8983
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8984 instruct convI2B( rRegI dst, rRegI src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8985 match(Set dst (Conv2B src));
a61af66fc99e Initial load
duke
parents:
diff changeset
8986
a61af66fc99e Initial load
duke
parents:
diff changeset
8987 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
8988 movI_nocopy(dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
8989 ci2b(dst,src,cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
8990 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8991 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8992
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
8993 instruct movP_nocopy(rRegI dst, eRegP src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
8994 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
8995 format %{ "MOV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8996 ins_encode( enc_Copy( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
8997 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
8998 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
8999
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
9000 instruct cp2b( rRegI dst, eRegP src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9001 effect( USE_DEF dst, USE src, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
9002 format %{ "NEG $dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9003 "ADC $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9004 ins_encode( neg_reg(dst),
a61af66fc99e Initial load
duke
parents:
diff changeset
9005 OpcRegReg(0x13,dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9006 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9007 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9008
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
9009 instruct convP2B( rRegI dst, eRegP src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9010 match(Set dst (Conv2B src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9011
a61af66fc99e Initial load
duke
parents:
diff changeset
9012 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9013 movP_nocopy(dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
9014 cp2b(dst,src,cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9015 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9016 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9017
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9018 instruct cmpLTMask(eCXRegI dst, ncxRegI p, ncxRegI q, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9019 match(Set dst (CmpLTMask p q));
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9020 effect(KILL cr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9021 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
9022
a61af66fc99e Initial load
duke
parents:
diff changeset
9023 // SETlt can only use low byte of EAX,EBX, ECX, or EDX as destination
a61af66fc99e Initial load
duke
parents:
diff changeset
9024 format %{ "XOR $dst,$dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9025 "CMP $p,$q\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9026 "SETlt $dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9027 "NEG $dst" %}
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9028 ins_encode %{
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9029 Register Rp = $p$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9030 Register Rq = $q$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9031 Register Rd = $dst$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9032 Label done;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9033 __ xorl(Rd, Rd);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9034 __ cmpl(Rp, Rq);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9035 __ setb(Assembler::less, Rd);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9036 __ negl(Rd);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9037 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9038
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9039 ins_pipe(pipe_slow);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9040 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9041
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9042 instruct cmpLTMask0(rRegI dst, immI0 zero, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9043 match(Set dst (CmpLTMask dst zero));
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9044 effect(DEF dst, KILL cr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9045 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
9046
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9047 format %{ "SAR $dst,31\t# cmpLTMask0" %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9048 ins_encode %{
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9049 __ sarl($dst$$Register, 31);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9050 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9051 ins_pipe(ialu_reg);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9052 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9053
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9054 /* better to save a register than avoid a branch */
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9055 instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9056 match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9057 effect(KILL cr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9058 ins_cost(400);
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9059 format %{ "SUB $p,$q\t# cadd_cmpLTMask\n\t"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9060 "JGE done\n\t"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9061 "ADD $p,$y\n"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9062 "done: " %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9063 ins_encode %{
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9064 Register Rp = $p$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9065 Register Rq = $q$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9066 Register Ry = $y$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9067 Label done;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9068 __ subl(Rp, Rq);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9069 __ jccb(Assembler::greaterEqual, done);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9070 __ addl(Rp, Ry);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9071 __ bind(done);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9072 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9073
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9074 ins_pipe(pipe_cmplt);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9075 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9076
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9077 /* better to save a register than avoid a branch */
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9078 instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, eFlagsReg cr) %{
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9079 match(Set y (AndI (CmpLTMask p q) y));
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9080 effect(KILL cr);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9081
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9082 ins_cost(300);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9083
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9084 format %{ "CMPL $p, $q\t# and_cmpLTMask\n\t"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9085 "JLT done\n\t"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9086 "XORL $y, $y\n"
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9087 "done: " %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9088 ins_encode %{
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9089 Register Rp = $p$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9090 Register Rq = $q$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9091 Register Ry = $y$$Register;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9092 Label done;
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9093 __ cmpl(Rp, Rq);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9094 __ jccb(Assembler::less, done);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9095 __ xorl(Ry, Ry);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9096 __ bind(done);
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9097 %}
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9098
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9099 ins_pipe(pipe_cmplt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9100 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9101
a61af66fc99e Initial load
duke
parents:
diff changeset
9102 /* If I enable this, I encourage spilling in the inner loop of compress.
9154
886d1fd67dc3 6443505: Ideal() function for CmpLTMask
drchase
parents: 8873
diff changeset
9103 instruct cadd_cmpLTMask_mem(ncxRegI p, ncxRegI q, memory y, eCXRegI tmp, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9104 match(Set p (AddI (AndI (CmpLTMask p q) (LoadI y)) (SubI p q)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9105 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9106
a61af66fc99e Initial load
duke
parents:
diff changeset
9107 //----------Long Instructions------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
9108 // Add Long Register with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
9109 instruct addL_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9110 match(Set dst (AddL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9111 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9112 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9113 format %{ "ADD $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9114 "ADC $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9115 opcode(0x03, 0x13);
a61af66fc99e Initial load
duke
parents:
diff changeset
9116 ins_encode( RegReg_Lo(dst, src), RegReg_Hi(dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9117 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9118 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9119
a61af66fc99e Initial load
duke
parents:
diff changeset
9120 // Add Long Register with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
9121 instruct addL_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9122 match(Set dst (AddL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9123 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9124 format %{ "ADD $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9125 "ADC $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9126 opcode(0x81,0x00,0x02); /* Opcode 81 /0, 81 /2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9127 ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9128 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9129 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9130
a61af66fc99e Initial load
duke
parents:
diff changeset
9131 // Add Long Register with Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
9132 instruct addL_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9133 match(Set dst (AddL dst (LoadL mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9134 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9135 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9136 format %{ "ADD $dst.lo,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9137 "ADC $dst.hi,$mem+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9138 opcode(0x03, 0x13);
a61af66fc99e Initial load
duke
parents:
diff changeset
9139 ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9140 ins_pipe( ialu_reg_long_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9141 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9142
a61af66fc99e Initial load
duke
parents:
diff changeset
9143 // Subtract Long Register with Register.
a61af66fc99e Initial load
duke
parents:
diff changeset
9144 instruct subL_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9145 match(Set dst (SubL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9146 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9147 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9148 format %{ "SUB $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9149 "SBB $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9150 opcode(0x2B, 0x1B);
a61af66fc99e Initial load
duke
parents:
diff changeset
9151 ins_encode( RegReg_Lo(dst, src), RegReg_Hi(dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9152 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9153 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9154
a61af66fc99e Initial load
duke
parents:
diff changeset
9155 // Subtract Long Register with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
9156 instruct subL_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9157 match(Set dst (SubL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9158 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9159 format %{ "SUB $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9160 "SBB $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9161 opcode(0x81,0x05,0x03); /* Opcode 81 /5, 81 /3 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9162 ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9163 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9164 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9165
a61af66fc99e Initial load
duke
parents:
diff changeset
9166 // Subtract Long Register with Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
9167 instruct subL_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9168 match(Set dst (SubL dst (LoadL mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9169 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9170 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9171 format %{ "SUB $dst.lo,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9172 "SBB $dst.hi,$mem+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9173 opcode(0x2B, 0x1B);
a61af66fc99e Initial load
duke
parents:
diff changeset
9174 ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9175 ins_pipe( ialu_reg_long_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9176 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9177
a61af66fc99e Initial load
duke
parents:
diff changeset
9178 instruct negL_eReg(eRegL dst, immL0 zero, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9179 match(Set dst (SubL zero dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
9180 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9181 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
9182 format %{ "NEG $dst.hi\n\tNEG $dst.lo\n\tSBB $dst.hi,0" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9183 ins_encode( neg_long(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9184 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9185 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9186
a61af66fc99e Initial load
duke
parents:
diff changeset
9187 // And Long Register with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
9188 instruct andL_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9189 match(Set dst (AndL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9190 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9191 format %{ "AND $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9192 "AND $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9193 opcode(0x23,0x23);
a61af66fc99e Initial load
duke
parents:
diff changeset
9194 ins_encode( RegReg_Lo( dst, src), RegReg_Hi( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9195 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9196 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9197
a61af66fc99e Initial load
duke
parents:
diff changeset
9198 // And Long Register with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
9199 instruct andL_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9200 match(Set dst (AndL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9201 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9202 format %{ "AND $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9203 "AND $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9204 opcode(0x81,0x04,0x04); /* Opcode 81 /4, 81 /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9205 ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9206 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9207 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9208
a61af66fc99e Initial load
duke
parents:
diff changeset
9209 // And Long Register with Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
9210 instruct andL_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9211 match(Set dst (AndL dst (LoadL mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9212 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9213 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9214 format %{ "AND $dst.lo,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9215 "AND $dst.hi,$mem+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9216 opcode(0x23, 0x23);
a61af66fc99e Initial load
duke
parents:
diff changeset
9217 ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9218 ins_pipe( ialu_reg_long_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9219 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9220
a61af66fc99e Initial load
duke
parents:
diff changeset
9221 // Or Long Register with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
9222 instruct orl_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9223 match(Set dst (OrL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9224 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9225 format %{ "OR $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9226 "OR $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9227 opcode(0x0B,0x0B);
a61af66fc99e Initial load
duke
parents:
diff changeset
9228 ins_encode( RegReg_Lo( dst, src), RegReg_Hi( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9229 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9230 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9231
a61af66fc99e Initial load
duke
parents:
diff changeset
9232 // Or Long Register with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
9233 instruct orl_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9234 match(Set dst (OrL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9235 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9236 format %{ "OR $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9237 "OR $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9238 opcode(0x81,0x01,0x01); /* Opcode 81 /1, 81 /1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9239 ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9240 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9241 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9242
a61af66fc99e Initial load
duke
parents:
diff changeset
9243 // Or Long Register with Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
9244 instruct orl_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9245 match(Set dst (OrL dst (LoadL mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9246 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9247 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9248 format %{ "OR $dst.lo,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9249 "OR $dst.hi,$mem+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9250 opcode(0x0B,0x0B);
a61af66fc99e Initial load
duke
parents:
diff changeset
9251 ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9252 ins_pipe( ialu_reg_long_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9253 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9254
a61af66fc99e Initial load
duke
parents:
diff changeset
9255 // Xor Long Register with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
9256 instruct xorl_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9257 match(Set dst (XorL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9258 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9259 format %{ "XOR $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9260 "XOR $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9261 opcode(0x33,0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
9262 ins_encode( RegReg_Lo( dst, src), RegReg_Hi( dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9263 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9264 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9265
403
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9266 // Xor Long Register with Immediate -1
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9267 instruct xorl_eReg_im1(eRegL dst, immL_M1 imm) %{
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9268 match(Set dst (XorL dst imm));
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9269 format %{ "NOT $dst.lo\n\t"
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9270 "NOT $dst.hi" %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9271 ins_encode %{
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9272 __ notl($dst$$Register);
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9273 __ notl(HIGH_FROM_LOW($dst$$Register));
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9274 %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9275 ins_pipe( ialu_reg_long );
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9276 %}
b744678d4d71 6752257: Use NOT instead of XOR -1 on x86
rasbold
parents: 304
diff changeset
9277
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9278 // Xor Long Register with Immediate
a61af66fc99e Initial load
duke
parents:
diff changeset
9279 instruct xorl_eReg_imm(eRegL dst, immL src, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9280 match(Set dst (XorL dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9281 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9282 format %{ "XOR $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9283 "XOR $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9284 opcode(0x81,0x06,0x06); /* Opcode 81 /6, 81 /6 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9285 ins_encode( Long_OpcSErm_Lo( dst, src ), Long_OpcSErm_Hi( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9286 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9287 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9288
a61af66fc99e Initial load
duke
parents:
diff changeset
9289 // Xor Long Register with Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
9290 instruct xorl_eReg_mem(eRegL dst, load_long_memory mem, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9291 match(Set dst (XorL dst (LoadL mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9292 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9293 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9294 format %{ "XOR $dst.lo,$mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9295 "XOR $dst.hi,$mem+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9296 opcode(0x33,0x33);
a61af66fc99e Initial load
duke
parents:
diff changeset
9297 ins_encode( OpcP, RegMem( dst, mem), OpcS, RegMem_Hi(dst,mem) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9298 ins_pipe( ialu_reg_long_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9299 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9300
219
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9301 // Shift Left Long by 1
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9302 instruct shlL_eReg_1(eRegL dst, immI_1 cnt, eFlagsReg cr) %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9303 predicate(UseNewLongLShift);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9304 match(Set dst (LShiftL dst cnt));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9305 effect(KILL cr);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9306 ins_cost(100);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9307 format %{ "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9308 "ADC $dst.hi,$dst.hi" %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9309 ins_encode %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9310 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9311 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9312 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9313 ins_pipe( ialu_reg_long );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9314 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9315
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9316 // Shift Left Long by 2
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9317 instruct shlL_eReg_2(eRegL dst, immI_2 cnt, eFlagsReg cr) %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9318 predicate(UseNewLongLShift);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9319 match(Set dst (LShiftL dst cnt));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9320 effect(KILL cr);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9321 ins_cost(100);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9322 format %{ "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9323 "ADC $dst.hi,$dst.hi\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9324 "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9325 "ADC $dst.hi,$dst.hi" %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9326 ins_encode %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9327 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9328 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9329 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9330 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9331 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9332 ins_pipe( ialu_reg_long );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9333 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9334
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9335 // Shift Left Long by 3
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9336 instruct shlL_eReg_3(eRegL dst, immI_3 cnt, eFlagsReg cr) %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9337 predicate(UseNewLongLShift);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9338 match(Set dst (LShiftL dst cnt));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9339 effect(KILL cr);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9340 ins_cost(100);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9341 format %{ "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9342 "ADC $dst.hi,$dst.hi\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9343 "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9344 "ADC $dst.hi,$dst.hi\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9345 "ADD $dst.lo,$dst.lo\n\t"
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9346 "ADC $dst.hi,$dst.hi" %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9347 ins_encode %{
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9348 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9349 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9350 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9351 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9352 __ addl($dst$$Register,$dst$$Register);
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9353 __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9354 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9355 ins_pipe( ialu_reg_long );
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9356 %}
ab65a4c9b2e8 6708714: Optimize long LShift on 32-bits x86
kvn
parents: 169
diff changeset
9357
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9358 // Shift Left Long by 1-31
a61af66fc99e Initial load
duke
parents:
diff changeset
9359 instruct shlL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9360 match(Set dst (LShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9361 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9362 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9363 format %{ "SHLD $dst.hi,$dst.lo,$cnt\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9364 "SHL $dst.lo,$cnt" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9365 opcode(0xC1, 0x4, 0xA4); /* 0F/A4, then C1 /4 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9366 ins_encode( move_long_small_shift(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9367 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9368 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9369
a61af66fc99e Initial load
duke
parents:
diff changeset
9370 // Shift Left Long by 32-63
a61af66fc99e Initial load
duke
parents:
diff changeset
9371 instruct shlL_eReg_32_63(eRegL dst, immI_32_63 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9372 match(Set dst (LShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9373 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9374 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
9375 format %{ "MOV $dst.hi,$dst.lo\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9376 "\tSHL $dst.hi,$cnt-32\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9377 "\tXOR $dst.lo,$dst.lo" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9378 opcode(0xC1, 0x4); /* C1 /4 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9379 ins_encode( move_long_big_shift_clr(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9380 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9381 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9382
a61af66fc99e Initial load
duke
parents:
diff changeset
9383 // Shift Left Long by variable
a61af66fc99e Initial load
duke
parents:
diff changeset
9384 instruct salL_eReg_CL(eRegL dst, eCXRegI shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9385 match(Set dst (LShiftL dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
9386 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9387 ins_cost(500+200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9388 size(17);
a61af66fc99e Initial load
duke
parents:
diff changeset
9389 format %{ "TEST $shift,32\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9390 "JEQ,s small\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9391 "MOV $dst.hi,$dst.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9392 "XOR $dst.lo,$dst.lo\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9393 "small:\tSHLD $dst.hi,$dst.lo,$shift\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9394 "SHL $dst.lo,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9395 ins_encode( shift_left_long( dst, shift ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9396 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9397 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9398
a61af66fc99e Initial load
duke
parents:
diff changeset
9399 // Shift Right Long by 1-31
a61af66fc99e Initial load
duke
parents:
diff changeset
9400 instruct shrL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9401 match(Set dst (URShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9402 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9403 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9404 format %{ "SHRD $dst.lo,$dst.hi,$cnt\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9405 "SHR $dst.hi,$cnt" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9406 opcode(0xC1, 0x5, 0xAC); /* 0F/AC, then C1 /5 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9407 ins_encode( move_long_small_shift(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9408 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9409 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9410
a61af66fc99e Initial load
duke
parents:
diff changeset
9411 // Shift Right Long by 32-63
a61af66fc99e Initial load
duke
parents:
diff changeset
9412 instruct shrL_eReg_32_63(eRegL dst, immI_32_63 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9413 match(Set dst (URShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9414 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9415 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
9416 format %{ "MOV $dst.lo,$dst.hi\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9417 "\tSHR $dst.lo,$cnt-32\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9418 "\tXOR $dst.hi,$dst.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9419 opcode(0xC1, 0x5); /* C1 /5 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9420 ins_encode( move_long_big_shift_clr(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9421 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9422 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9423
a61af66fc99e Initial load
duke
parents:
diff changeset
9424 // Shift Right Long by variable
a61af66fc99e Initial load
duke
parents:
diff changeset
9425 instruct shrL_eReg_CL(eRegL dst, eCXRegI shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9426 match(Set dst (URShiftL dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
9427 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9428 ins_cost(600);
a61af66fc99e Initial load
duke
parents:
diff changeset
9429 size(17);
a61af66fc99e Initial load
duke
parents:
diff changeset
9430 format %{ "TEST $shift,32\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9431 "JEQ,s small\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9432 "MOV $dst.lo,$dst.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9433 "XOR $dst.hi,$dst.hi\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9434 "small:\tSHRD $dst.lo,$dst.hi,$shift\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9435 "SHR $dst.hi,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9436 ins_encode( shift_right_long( dst, shift ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9437 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9438 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9439
a61af66fc99e Initial load
duke
parents:
diff changeset
9440 // Shift Right Long by 1-31
a61af66fc99e Initial load
duke
parents:
diff changeset
9441 instruct sarL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9442 match(Set dst (RShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9443 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9444 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9445 format %{ "SHRD $dst.lo,$dst.hi,$cnt\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9446 "SAR $dst.hi,$cnt" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9447 opcode(0xC1, 0x7, 0xAC); /* 0F/AC, then C1 /7 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9448 ins_encode( move_long_small_shift(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9449 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9450 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9451
a61af66fc99e Initial load
duke
parents:
diff changeset
9452 // Shift Right Long by 32-63
a61af66fc99e Initial load
duke
parents:
diff changeset
9453 instruct sarL_eReg_32_63( eRegL dst, immI_32_63 cnt, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9454 match(Set dst (RShiftL dst cnt));
a61af66fc99e Initial load
duke
parents:
diff changeset
9455 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9456 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
9457 format %{ "MOV $dst.lo,$dst.hi\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9458 "\tSAR $dst.lo,$cnt-32\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9459 "\tSAR $dst.hi,31" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9460 opcode(0xC1, 0x7); /* C1 /7 ib */
a61af66fc99e Initial load
duke
parents:
diff changeset
9461 ins_encode( move_long_big_shift_sign(dst,cnt) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9462 ins_pipe( ialu_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
9463 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9464
a61af66fc99e Initial load
duke
parents:
diff changeset
9465 // Shift Right arithmetic Long by variable
a61af66fc99e Initial load
duke
parents:
diff changeset
9466 instruct sarL_eReg_CL(eRegL dst, eCXRegI shift, eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
9467 match(Set dst (RShiftL dst shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
9468 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9469 ins_cost(600);
a61af66fc99e Initial load
duke
parents:
diff changeset
9470 size(18);
a61af66fc99e Initial load
duke
parents:
diff changeset
9471 format %{ "TEST $shift,32\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9472 "JEQ,s small\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9473 "MOV $dst.lo,$dst.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9474 "SAR $dst.hi,31\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9475 "small:\tSHRD $dst.lo,$dst.hi,$shift\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9476 "SAR $dst.hi,$shift" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9477 ins_encode( shift_right_arith_long( dst, shift ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9478 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9479 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9480
a61af66fc99e Initial load
duke
parents:
diff changeset
9481
a61af66fc99e Initial load
duke
parents:
diff changeset
9482 //----------Double Instructions------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
9483 // Double Math
a61af66fc99e Initial load
duke
parents:
diff changeset
9484
a61af66fc99e Initial load
duke
parents:
diff changeset
9485 // Compare & branch
a61af66fc99e Initial load
duke
parents:
diff changeset
9486
a61af66fc99e Initial load
duke
parents:
diff changeset
9487 // P6 version of float compare, sets condition codes in EFLAGS
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9488 instruct cmpDPR_cc_P6(eFlagsRegU cr, regDPR src1, regDPR src2, eAXRegI rax) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9489 predicate(VM_Version::supports_cmov() && UseSSE <=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9490 match(Set cr (CmpD src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9491 effect(KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
9492 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
9493 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9494 "FUCOMIP ST,$src2 // P6 instruction\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9495 "JNP exit\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9496 "MOV ah,1 // saw a NaN, set CF\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9497 "SAHF\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9498 "exit:\tNOP // avoid branch to branch" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9499 opcode(0xDF, 0x05); /* DF E8+i or DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9500 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9501 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
9502 cmpF_P6_fixup );
a61af66fc99e Initial load
duke
parents:
diff changeset
9503 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9504 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9505
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9506 instruct cmpDPR_cc_P6CF(eFlagsRegUCF cr, regDPR src1, regDPR src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9507 predicate(VM_Version::supports_cmov() && UseSSE <=1);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9508 match(Set cr (CmpD src1 src2));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9509 ins_cost(150);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9510 format %{ "FLD $src1\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9511 "FUCOMIP ST,$src2 // P6 instruction" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9512 opcode(0xDF, 0x05); /* DF E8+i or DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9513 ins_encode( Push_Reg_DPR(src1),
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9514 OpcP, RegOpc(src2));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9515 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9516 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9517
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9518 // Compare & branch
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9519 instruct cmpDPR_cc(eFlagsRegU cr, regDPR src1, regDPR src2, eAXRegI rax) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9520 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9521 match(Set cr (CmpD src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9522 effect(KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
9523 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9524 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9525 "FCOMp $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9526 "FNSTSW AX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9527 "TEST AX,0x400\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9528 "JZ,s flags\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9529 "MOV AH,1\t# unordered treat as LT\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
9530 "flags:\tSAHF" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9531 opcode(0xD8, 0x3); /* D8 D8+i or D8 /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9532 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9533 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
9534 fpu_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
9535 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9536 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9537
a61af66fc99e Initial load
duke
parents:
diff changeset
9538 // Compare vs zero into -1,0,1
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
9539 instruct cmpDPR_0(rRegI dst, regDPR src1, immDPR0 zero, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9540 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9541 match(Set dst (CmpD3 src1 zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
9542 effect(KILL cr, KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
9543 ins_cost(280);
a61af66fc99e Initial load
duke
parents:
diff changeset
9544 format %{ "FTSTD $dst,$src1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9545 opcode(0xE4, 0xD9);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9546 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9547 OpcS, OpcP, PopFPU,
a61af66fc99e Initial load
duke
parents:
diff changeset
9548 CmpF_Result(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
9549 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9550 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9551
a61af66fc99e Initial load
duke
parents:
diff changeset
9552 // Compare into -1,0,1
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
9553 instruct cmpDPR_reg(rRegI dst, regDPR src1, regDPR src2, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9554 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9555 match(Set dst (CmpD3 src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9556 effect(KILL cr, KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
9557 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
9558 format %{ "FCMPD $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9559 opcode(0xD8, 0x3); /* D8 D8+i or D8 /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9560 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9561 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
9562 CmpF_Result(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
9563 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9564 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9565
a61af66fc99e Initial load
duke
parents:
diff changeset
9566 // float compare and set condition codes in EFLAGS by XMM regs
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9567 instruct cmpD_cc(eFlagsRegU cr, regD src1, regD src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9568 predicate(UseSSE>=2);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9569 match(Set cr (CmpD src1 src2));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9570 ins_cost(145);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9571 format %{ "UCOMISD $src1,$src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9572 "JNP,s exit\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9573 "PUSHF\t# saw NaN, set CF\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9574 "AND [rsp], #0xffffff2b\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9575 "POPF\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9576 "exit:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9577 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9578 __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9579 emit_cmpfp_fixup(_masm);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9580 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9581 ins_pipe( pipe_slow );
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9582 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9583
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9584 instruct cmpD_ccCF(eFlagsRegUCF cr, regD src1, regD src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9585 predicate(UseSSE>=2);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9586 match(Set cr (CmpD src1 src2));
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9587 ins_cost(100);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9588 format %{ "UCOMISD $src1,$src2" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9589 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9590 __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9591 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9592 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9593 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9594
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9595 // float compare and set condition codes in EFLAGS by XMM regs
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9596 instruct cmpD_ccmem(eFlagsRegU cr, regD src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9597 predicate(UseSSE>=2);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9598 match(Set cr (CmpD src1 (LoadD src2)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9599 ins_cost(145);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9600 format %{ "UCOMISD $src1,$src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9601 "JNP,s exit\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9602 "PUSHF\t# saw NaN, set CF\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9603 "AND [rsp], #0xffffff2b\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9604 "POPF\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9605 "exit:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9606 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9607 __ ucomisd($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9608 emit_cmpfp_fixup(_masm);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9609 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9610 ins_pipe( pipe_slow );
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9611 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9612
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9613 instruct cmpD_ccmemCF(eFlagsRegUCF cr, regD src1, memory src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9614 predicate(UseSSE>=2);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9615 match(Set cr (CmpD src1 (LoadD src2)));
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9616 ins_cost(100);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9617 format %{ "UCOMISD $src1,$src2" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9618 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9619 __ ucomisd($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9620 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9621 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9622 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
9623
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9624 // Compare into -1,0,1 in XMM
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9625 instruct cmpD_reg(xRegI dst, regD src1, regD src2, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9626 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
9627 match(Set dst (CmpD3 src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9628 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9629 ins_cost(255);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9630 format %{ "UCOMISD $src1, $src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9631 "MOV $dst, #-1\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9632 "JP,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9633 "JB,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9634 "SETNE $dst\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9635 "MOVZB $dst, $dst\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9636 "done:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9637 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9638 __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9639 emit_cmpfp3(_masm, $dst$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9640 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9641 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9642 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9643
a61af66fc99e Initial load
duke
parents:
diff changeset
9644 // Compare into -1,0,1 in XMM and memory
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9645 instruct cmpD_regmem(xRegI dst, regD src1, memory src2, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9646 predicate(UseSSE>=2);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9647 match(Set dst (CmpD3 src1 (LoadD src2)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9648 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
9649 ins_cost(275);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9650 format %{ "UCOMISD $src1, $src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9651 "MOV $dst, #-1\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9652 "JP,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9653 "JB,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9654 "SETNE $dst\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9655 "MOVZB $dst, $dst\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9656 "done:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9657 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9658 __ ucomisd($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9659 emit_cmpfp3(_masm, $dst$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
9660 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9661 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
9662 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9663
a61af66fc99e Initial load
duke
parents:
diff changeset
9664
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9665 instruct subDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9666 predicate (UseSSE <=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9667 match(Set dst (SubD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9668
a61af66fc99e Initial load
duke
parents:
diff changeset
9669 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9670 "DSUBp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9671 opcode(0xDE, 0x5); /* DE E8+i or DE /5 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9672 ins_cost(150);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9673 ins_encode( Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9674 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9675 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9676 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9677
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9678 instruct subDPR_reg_round(stackSlotD dst, regDPR src1, regDPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9679 predicate (UseSSE <=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9680 match(Set dst (RoundDouble (SubD src1 src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9681 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
9682
a61af66fc99e Initial load
duke
parents:
diff changeset
9683 format %{ "FLD $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9684 "DSUB ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9685 "FSTP_D $dst\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9686 opcode(0xD8, 0x5);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9687 ins_encode( Push_Reg_DPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9688 OpcP, RegOpc(src1), Pop_Mem_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9689 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9690 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9691
a61af66fc99e Initial load
duke
parents:
diff changeset
9692
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9693 instruct subDPR_reg_mem(regDPR dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9694 predicate (UseSSE <=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9695 match(Set dst (SubD dst (LoadD src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9696 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
9697
a61af66fc99e Initial load
duke
parents:
diff changeset
9698 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9699 "DSUBp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9700 opcode(0xDE, 0x5, 0xDD); /* DE C0+i */ /* LoadD DD /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9701 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src),
a61af66fc99e Initial load
duke
parents:
diff changeset
9702 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9703 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9704 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9705
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9706 instruct absDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9707 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9708 match(Set dst (AbsD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9709 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
9710 format %{ "FABS" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9711 opcode(0xE1, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
9712 ins_encode( OpcS, OpcP );
a61af66fc99e Initial load
duke
parents:
diff changeset
9713 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9714 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9715
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9716 instruct negDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9717 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9718 match(Set dst (NegD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9719 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
9720 format %{ "FCHS" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9721 opcode(0xE0, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
9722 ins_encode( OpcS, OpcP );
a61af66fc99e Initial load
duke
parents:
diff changeset
9723 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9724 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9725
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9726 instruct addDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9727 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9728 match(Set dst (AddD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9729 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9730 "DADD $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9731 size(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
9732 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
9733 opcode(0xDE, 0x0); /* DE C0+i or DE /0*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9734 ins_encode( Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9735 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9736 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9737 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9738
a61af66fc99e Initial load
duke
parents:
diff changeset
9739
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9740 instruct addDPR_reg_round(stackSlotD dst, regDPR src1, regDPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9741 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9742 match(Set dst (RoundDouble (AddD src1 src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9743 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
9744
a61af66fc99e Initial load
duke
parents:
diff changeset
9745 format %{ "FLD $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9746 "DADD ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9747 "FSTP_D $dst\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9748 opcode(0xD8, 0x0); /* D8 C0+i or D8 /0*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9749 ins_encode( Push_Reg_DPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9750 OpcP, RegOpc(src1), Pop_Mem_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9751 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9752 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9753
a61af66fc99e Initial load
duke
parents:
diff changeset
9754
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9755 instruct addDPR_reg_mem(regDPR dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9756 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9757 match(Set dst (AddD dst (LoadD src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9758 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
9759
a61af66fc99e Initial load
duke
parents:
diff changeset
9760 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9761 "DADDp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9762 opcode(0xDE, 0x0, 0xDD); /* DE C0+i */ /* LoadD DD /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9763 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src),
a61af66fc99e Initial load
duke
parents:
diff changeset
9764 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9765 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9766 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9767
a61af66fc99e Initial load
duke
parents:
diff changeset
9768 // add-to-memory
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9769 instruct addDPR_mem_reg(memory dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9770 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9771 match(Set dst (StoreD dst (RoundDouble (AddD (LoadD dst) src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
9772 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
9773
a61af66fc99e Initial load
duke
parents:
diff changeset
9774 format %{ "FLD_D $dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9775 "DADD ST,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9776 "FST_D $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9777 opcode(0xDD, 0x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
9778 ins_encode( Opcode(0xDD), RMopc_Mem(0x00,dst),
a61af66fc99e Initial load
duke
parents:
diff changeset
9779 Opcode(0xD8), RegOpc(src),
a61af66fc99e Initial load
duke
parents:
diff changeset
9780 set_instruction_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
9781 Opcode(0xDD), RMopc_Mem(0x03,dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9782 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9783 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9784
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9785 instruct addDPR_reg_imm1(regDPR dst, immDPR1 con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9786 predicate(UseSSE<=1);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9787 match(Set dst (AddD dst con));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9788 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
9789 format %{ "FLD1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9790 "DADDp $dst,ST" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9791 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9792 __ fld1();
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9793 __ faddp($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9794 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9795 ins_pipe(fpu_reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9796 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9797
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9798 instruct addDPR_reg_imm(regDPR dst, immDPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9799 predicate(UseSSE<=1 && _kids[1]->_leaf->getd() != 0.0 && _kids[1]->_leaf->getd() != 1.0 );
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9800 match(Set dst (AddD dst con));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9801 ins_cost(200);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9802 format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9803 "DADDp $dst,ST" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9804 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9805 __ fld_d($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9806 __ faddp($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9807 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9808 ins_pipe(fpu_reg_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9809 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9810
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9811 instruct addDPR_reg_imm_round(stackSlotD dst, regDPR src, immDPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9812 predicate(UseSSE<=1 && _kids[0]->_kids[1]->_leaf->getd() != 0.0 && _kids[0]->_kids[1]->_leaf->getd() != 1.0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9813 match(Set dst (RoundDouble (AddD src con)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9814 ins_cost(200);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9815 format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9816 "DADD ST,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9817 "FSTP_D $dst\t# D-round" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9818 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9819 __ fld_d($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9820 __ fadd($src$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9821 __ fstp_d(Address(rsp, $dst$$disp));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9822 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9823 ins_pipe(fpu_mem_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9824 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9825
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9826 instruct mulDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9827 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9828 match(Set dst (MulD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9829 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9830 "DMULp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9831 opcode(0xDE, 0x1); /* DE C8+i or DE /1*/
a61af66fc99e Initial load
duke
parents:
diff changeset
9832 ins_cost(150);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9833 ins_encode( Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9834 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9835 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9836 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9837
a61af66fc99e Initial load
duke
parents:
diff changeset
9838 // Strict FP instruction biases argument before multiply then
a61af66fc99e Initial load
duke
parents:
diff changeset
9839 // biases result to avoid double rounding of subnormals.
a61af66fc99e Initial load
duke
parents:
diff changeset
9840 //
a61af66fc99e Initial load
duke
parents:
diff changeset
9841 // scale arg1 by multiplying arg1 by 2^(-15360)
a61af66fc99e Initial load
duke
parents:
diff changeset
9842 // load arg2
a61af66fc99e Initial load
duke
parents:
diff changeset
9843 // multiply scaled arg1 by arg2
a61af66fc99e Initial load
duke
parents:
diff changeset
9844 // rescale product by 2^(15360)
a61af66fc99e Initial load
duke
parents:
diff changeset
9845 //
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9846 instruct strictfp_mulDPR_reg(regDPR1 dst, regnotDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9847 predicate( UseSSE<=1 && Compile::current()->has_method() && Compile::current()->method()->is_strict() );
a61af66fc99e Initial load
duke
parents:
diff changeset
9848 match(Set dst (MulD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9849 ins_cost(1); // Select this instruction for all strict FP double multiplies
a61af66fc99e Initial load
duke
parents:
diff changeset
9850
a61af66fc99e Initial load
duke
parents:
diff changeset
9851 format %{ "FLD StubRoutines::_fpu_subnormal_bias1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9852 "DMULp $dst,ST\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9853 "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9854 "DMULp $dst,ST\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9855 "FLD StubRoutines::_fpu_subnormal_bias2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9856 "DMULp $dst,ST\n\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9857 opcode(0xDE, 0x1); /* DE C8+i or DE /1*/
a61af66fc99e Initial load
duke
parents:
diff changeset
9858 ins_encode( strictfp_bias1(dst),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9859 Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9860 OpcP, RegOpc(dst),
a61af66fc99e Initial load
duke
parents:
diff changeset
9861 strictfp_bias2(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9862 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9863 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9864
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9865 instruct mulDPR_reg_imm(regDPR dst, immDPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9866 predicate( UseSSE<=1 && _kids[1]->_leaf->getd() != 0.0 && _kids[1]->_leaf->getd() != 1.0 );
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9867 match(Set dst (MulD dst con));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9868 ins_cost(200);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9869 format %{ "FLD_D [$constantaddress]\t# load from constant table: double=$con\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9870 "DMULp $dst,ST" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9871 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9872 __ fld_d($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9873 __ fmulp($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9874 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
9875 ins_pipe(fpu_reg_mem);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9876 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9877
a61af66fc99e Initial load
duke
parents:
diff changeset
9878
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9879 instruct mulDPR_reg_mem(regDPR dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9880 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9881 match(Set dst (MulD dst (LoadD src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9882 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
9883 format %{ "FLD_D $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9884 "DMULp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9885 opcode(0xDE, 0x1, 0xDD); /* DE C8+i or DE /1*/ /* LoadD DD /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9886 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src),
a61af66fc99e Initial load
duke
parents:
diff changeset
9887 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9888 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9889 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9890
a61af66fc99e Initial load
duke
parents:
diff changeset
9891 //
a61af66fc99e Initial load
duke
parents:
diff changeset
9892 // Cisc-alternate to reg-reg multiply
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9893 instruct mulDPR_reg_mem_cisc(regDPR dst, regDPR src, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9894 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9895 match(Set dst (MulD src (LoadD mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9896 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
9897 format %{ "FLD_D $mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9898 "DMUL ST,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9899 "FSTP_D $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9900 opcode(0xD8, 0x1, 0xD9); /* D8 C8+i */ /* LoadD D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
9901 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9902 OpcReg_FPR(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9903 Pop_Reg_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9904 ins_pipe( fpu_reg_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
9905 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9906
a61af66fc99e Initial load
duke
parents:
diff changeset
9907
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9908 // MACRO3 -- addDPR a mulDPR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9909 // This instruction is a '2-address' instruction in that the result goes
a61af66fc99e Initial load
duke
parents:
diff changeset
9910 // back to src2. This eliminates a move from the macro; possibly the
a61af66fc99e Initial load
duke
parents:
diff changeset
9911 // register allocator will have to add it back (and maybe not).
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9912 instruct addDPR_mulDPR_reg(regDPR src2, regDPR src1, regDPR src0) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9913 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9914 match(Set src2 (AddD (MulD src0 src1) src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9915 format %{ "FLD $src0\t# ===MACRO3d===\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9916 "DMUL ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9917 "DADDp $src2,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9918 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
9919 opcode(0xDD); /* LoadD DD /0 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9920 ins_encode( Push_Reg_FPR(src0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9921 FMul_ST_reg(src1),
a61af66fc99e Initial load
duke
parents:
diff changeset
9922 FAddP_reg_ST(src2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9923 ins_pipe( fpu_reg_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9924 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9925
a61af66fc99e Initial load
duke
parents:
diff changeset
9926
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9927 // MACRO3 -- subDPR a mulDPR
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9928 instruct subDPR_mulDPR_reg(regDPR src2, regDPR src1, regDPR src0) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9929 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9930 match(Set src2 (SubD (MulD src0 src1) src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9931 format %{ "FLD $src0\t# ===MACRO3d===\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9932 "DMUL ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9933 "DSUBRp $src2,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9934 ins_cost(250);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9935 ins_encode( Push_Reg_FPR(src0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9936 FMul_ST_reg(src1),
a61af66fc99e Initial load
duke
parents:
diff changeset
9937 Opcode(0xDE), Opc_plus(0xE0,src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
9938 ins_pipe( fpu_reg_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9939 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9940
a61af66fc99e Initial load
duke
parents:
diff changeset
9941
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9942 instruct divDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9943 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
9944 match(Set dst (DivD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9945
a61af66fc99e Initial load
duke
parents:
diff changeset
9946 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9947 "FDIVp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9948 opcode(0xDE, 0x7); /* DE F8+i or DE /7*/
a61af66fc99e Initial load
duke
parents:
diff changeset
9949 ins_cost(150);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9950 ins_encode( Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9951 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9952 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9953 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9954
a61af66fc99e Initial load
duke
parents:
diff changeset
9955 // Strict FP instruction biases argument before division then
a61af66fc99e Initial load
duke
parents:
diff changeset
9956 // biases result, to avoid double rounding of subnormals.
a61af66fc99e Initial load
duke
parents:
diff changeset
9957 //
a61af66fc99e Initial load
duke
parents:
diff changeset
9958 // scale dividend by multiplying dividend by 2^(-15360)
a61af66fc99e Initial load
duke
parents:
diff changeset
9959 // load divisor
a61af66fc99e Initial load
duke
parents:
diff changeset
9960 // divide scaled dividend by divisor
a61af66fc99e Initial load
duke
parents:
diff changeset
9961 // rescale quotient by 2^(15360)
a61af66fc99e Initial load
duke
parents:
diff changeset
9962 //
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9963 instruct strictfp_divDPR_reg(regDPR1 dst, regnotDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9964 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9965 match(Set dst (DivD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
9966 predicate( UseSSE<=1 && Compile::current()->has_method() && Compile::current()->method()->is_strict() );
a61af66fc99e Initial load
duke
parents:
diff changeset
9967 ins_cost(01);
a61af66fc99e Initial load
duke
parents:
diff changeset
9968
a61af66fc99e Initial load
duke
parents:
diff changeset
9969 format %{ "FLD StubRoutines::_fpu_subnormal_bias1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9970 "DMULp $dst,ST\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9971 "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9972 "FDIVp $dst,ST\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9973 "FLD StubRoutines::_fpu_subnormal_bias2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9974 "DMULp $dst,ST\n\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9975 opcode(0xDE, 0x7); /* DE F8+i or DE /7*/
a61af66fc99e Initial load
duke
parents:
diff changeset
9976 ins_encode( strictfp_bias1(dst),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9977 Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9978 OpcP, RegOpc(dst),
a61af66fc99e Initial load
duke
parents:
diff changeset
9979 strictfp_bias2(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9980 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9981 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9982
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9983 instruct divDPR_reg_round(stackSlotD dst, regDPR src1, regDPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9984 predicate( UseSSE<=1 && !(Compile::current()->has_method() && Compile::current()->method()->is_strict()) );
a61af66fc99e Initial load
duke
parents:
diff changeset
9985 match(Set dst (RoundDouble (DivD src1 src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
9986
a61af66fc99e Initial load
duke
parents:
diff changeset
9987 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9988 "FDIV ST,$src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
9989 "FSTP_D $dst\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9990 opcode(0xD8, 0x6); /* D8 F0+i or D8 /6 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9991 ins_encode( Push_Reg_DPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9992 OpcP, RegOpc(src2), Pop_Mem_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9993 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
9994 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
9995
a61af66fc99e Initial load
duke
parents:
diff changeset
9996
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
9997 instruct modDPR_reg(regDPR dst, regDPR src, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
9998 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
9999 match(Set dst (ModD dst src));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10000 effect(KILL rax, KILL cr); // emitModDPR() uses EAX and EFLAGS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10001
a61af66fc99e Initial load
duke
parents:
diff changeset
10002 format %{ "DMOD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10003 ins_cost(250);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10004 ins_encode(Push_Reg_Mod_DPR(dst, src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10005 emitModDPR(),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10006 Push_Result_Mod_DPR(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10007 Pop_Reg_DPR(dst));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10008 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10009 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10010
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10011 instruct modD_reg(regD dst, regD src0, regD src1, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10012 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10013 match(Set dst (ModD src0 src1));
a61af66fc99e Initial load
duke
parents:
diff changeset
10014 effect(KILL rax, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10015
a61af66fc99e Initial load
duke
parents:
diff changeset
10016 format %{ "SUB ESP,8\t # DMOD\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10017 "\tMOVSD [ESP+0],$src1\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10018 "\tFLD_D [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10019 "\tMOVSD [ESP+0],$src0\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10020 "\tFLD_D [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10021 "loop:\tFPREM\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10022 "\tFWAIT\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10023 "\tFNSTSW AX\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10024 "\tSAHF\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10025 "\tJP loop\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10026 "\tFSTP_D [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10027 "\tMOVSD $dst,[ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10028 "\tADD ESP,8\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10029 "\tFSTP ST0\t # Restore FPU Stack"
a61af66fc99e Initial load
duke
parents:
diff changeset
10030 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10031 ins_cost(250);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10032 ins_encode( Push_ModD_encoding(src0, src1), emitModDPR(), Push_ResultD(dst), PopFPU);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10033 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10034 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10035
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10036 instruct sinDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10037 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10038 match(Set dst (SinD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10039 ins_cost(1800);
a61af66fc99e Initial load
duke
parents:
diff changeset
10040 format %{ "DSIN $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10041 opcode(0xD9, 0xFE);
a61af66fc99e Initial load
duke
parents:
diff changeset
10042 ins_encode( OpcP, OpcS );
a61af66fc99e Initial load
duke
parents:
diff changeset
10043 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10044 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10045
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10046 instruct sinD_reg(regD dst, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10047 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10048 match(Set dst (SinD dst));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10049 effect(KILL cr); // Push_{Src|Result}D() uses "{SUB|ADD} ESP,8"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10050 ins_cost(1800);
a61af66fc99e Initial load
duke
parents:
diff changeset
10051 format %{ "DSIN $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10052 opcode(0xD9, 0xFE);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10053 ins_encode( Push_SrcD(dst), OpcP, OpcS, Push_ResultD(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10054 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10055 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10056
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10057 instruct cosDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10058 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10059 match(Set dst (CosD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10060 ins_cost(1800);
a61af66fc99e Initial load
duke
parents:
diff changeset
10061 format %{ "DCOS $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10062 opcode(0xD9, 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
10063 ins_encode( OpcP, OpcS );
a61af66fc99e Initial load
duke
parents:
diff changeset
10064 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10065 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10066
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10067 instruct cosD_reg(regD dst, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10068 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10069 match(Set dst (CosD dst));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10070 effect(KILL cr); // Push_{Src|Result}D() uses "{SUB|ADD} ESP,8"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10071 ins_cost(1800);
a61af66fc99e Initial load
duke
parents:
diff changeset
10072 format %{ "DCOS $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10073 opcode(0xD9, 0xFF);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10074 ins_encode( Push_SrcD(dst), OpcP, OpcS, Push_ResultD(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10075 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10076 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10077
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10078 instruct tanDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10079 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10080 match(Set dst(TanD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10081 format %{ "DTAN $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10082 ins_encode( Opcode(0xD9), Opcode(0xF2), // fptan
a61af66fc99e Initial load
duke
parents:
diff changeset
10083 Opcode(0xDD), Opcode(0xD8)); // fstp st
a61af66fc99e Initial load
duke
parents:
diff changeset
10084 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10085 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10086
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10087 instruct tanD_reg(regD dst, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10088 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10089 match(Set dst(TanD dst));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10090 effect(KILL cr); // Push_{Src|Result}D() uses "{SUB|ADD} ESP,8"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10091 format %{ "DTAN $dst" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10092 ins_encode( Push_SrcD(dst),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10093 Opcode(0xD9), Opcode(0xF2), // fptan
a61af66fc99e Initial load
duke
parents:
diff changeset
10094 Opcode(0xDD), Opcode(0xD8), // fstp st
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10095 Push_ResultD(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10096 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10097 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10098
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10099 instruct atanDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10100 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10101 match(Set dst(AtanD dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10102 format %{ "DATA $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10103 opcode(0xD9, 0xF3);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10104 ins_encode( Push_Reg_DPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10105 OpcP, OpcS, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10106 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10107 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10108
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10109 instruct atanD_reg(regD dst, regD src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10110 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10111 match(Set dst(AtanD dst src));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10112 effect(KILL cr); // Push_{Src|Result}D() uses "{SUB|ADD} ESP,8"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10113 format %{ "DATA $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10114 opcode(0xD9, 0xF3);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10115 ins_encode( Push_SrcD(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10116 OpcP, OpcS, Push_ResultD(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10117 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10118 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10119
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10120 instruct sqrtDPR_reg(regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10121 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10122 match(Set dst (SqrtD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10123 format %{ "DSQRT $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10124 opcode(0xFA, 0xD9);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10125 ins_encode( Push_Reg_DPR(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10126 OpcS, OpcP, Pop_Reg_DPR(dst) );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10127 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10128 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10129
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10130 instruct powDPR_reg(regDPR X, regDPR1 Y, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10131 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10132 match(Set Y (PowD X Y)); // Raise X to the Yth power
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10133 effect(KILL rax, KILL rdx, KILL rcx, KILL cr);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10134 format %{ "fast_pow $X $Y -> $Y // KILL $rax, $rcx, $rdx" %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10135 ins_encode %{
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10136 __ subptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10137 __ fld_s($X$$reg - 1);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10138 __ fast_pow();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10139 __ addptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10140 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10141 ins_pipe( pipe_slow );
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10142 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10143
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10144 instruct powD_reg(regD dst, regD src0, regD src1, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10145 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10146 match(Set dst (PowD src0 src1)); // Raise src0 to the src1'th power
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10147 effect(KILL rax, KILL rdx, KILL rcx, KILL cr);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10148 format %{ "fast_pow $src0 $src1 -> $dst // KILL $rax, $rcx, $rdx" %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10149 ins_encode %{
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10150 __ subptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10151 __ movdbl(Address(rsp, 0), $src1$$XMMRegister);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10152 __ fld_d(Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10153 __ movdbl(Address(rsp, 0), $src0$$XMMRegister);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10154 __ fld_d(Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10155 __ fast_pow();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10156 __ fstp_d(Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10157 __ movdbl($dst$$XMMRegister, Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10158 __ addptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10159 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10160 ins_pipe( pipe_slow );
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10161 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10162
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10163
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10164 instruct expDPR_reg(regDPR1 dpr1, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10165 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10166 match(Set dpr1 (ExpD dpr1));
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10167 effect(KILL rax, KILL rcx, KILL rdx, KILL cr);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10168 format %{ "fast_exp $dpr1 -> $dpr1 // KILL $rax, $rcx, $rdx" %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10169 ins_encode %{
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10170 __ fast_exp();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10171 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10172 ins_pipe( pipe_slow );
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10173 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10174
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10175 instruct expD_reg(regD dst, regD src, eAXRegI rax, eDXRegI rdx, eCXRegI rcx, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10176 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10177 match(Set dst (ExpD src));
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10178 effect(KILL rax, KILL rcx, KILL rdx, KILL cr);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10179 format %{ "fast_exp $dst -> $src // KILL $rax, $rcx, $rdx" %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10180 ins_encode %{
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10181 __ subptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10182 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10183 __ fld_d(Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10184 __ fast_exp();
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10185 __ fstp_d(Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10186 __ movdbl($dst$$XMMRegister, Address(rsp, 0));
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10187 __ addptr(rsp, 8);
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10188 %}
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10189 ins_pipe( pipe_slow );
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 5934
diff changeset
10190 %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10191
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10192 instruct log10DPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10193 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10194 // The source Double operand on FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
10195 match(Set dst (Log10D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10196 // fldlg2 ; push log_10(2) on the FPU stack; full 80-bit number
a61af66fc99e Initial load
duke
parents:
diff changeset
10197 // fxch ; swap ST(0) with ST(1)
a61af66fc99e Initial load
duke
parents:
diff changeset
10198 // fyl2x ; compute log_10(2) * log_2(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
10199 format %{ "FLDLG2 \t\t\t#Log10\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10200 "FXCH \n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10201 "FYL2X \t\t\t# Q=Log10*Log_2(x)"
a61af66fc99e Initial load
duke
parents:
diff changeset
10202 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10203 ins_encode( Opcode(0xD9), Opcode(0xEC), // fldlg2
a61af66fc99e Initial load
duke
parents:
diff changeset
10204 Opcode(0xD9), Opcode(0xC9), // fxch
a61af66fc99e Initial load
duke
parents:
diff changeset
10205 Opcode(0xD9), Opcode(0xF1)); // fyl2x
a61af66fc99e Initial load
duke
parents:
diff changeset
10206
a61af66fc99e Initial load
duke
parents:
diff changeset
10207 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10208 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10209
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10210 instruct log10D_reg(regD dst, regD src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10211 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10212 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10213 match(Set dst (Log10D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10214 // fldlg2 ; push log_10(2) on the FPU stack; full 80-bit number
a61af66fc99e Initial load
duke
parents:
diff changeset
10215 // fyl2x ; compute log_10(2) * log_2(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
10216 format %{ "FLDLG2 \t\t\t#Log10\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10217 "FYL2X \t\t\t# Q=Log10*Log_2(x)"
a61af66fc99e Initial load
duke
parents:
diff changeset
10218 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10219 ins_encode( Opcode(0xD9), Opcode(0xEC), // fldlg2
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10220 Push_SrcD(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10221 Opcode(0xD9), Opcode(0xF1), // fyl2x
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10222 Push_ResultD(dst));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10223
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10224 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10225 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10226
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10227 instruct logDPR_reg(regDPR1 dst, regDPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10228 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10229 // The source Double operand on FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
10230 match(Set dst (LogD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10231 // fldln2 ; push log_e(2) on the FPU stack; full 80-bit number
a61af66fc99e Initial load
duke
parents:
diff changeset
10232 // fxch ; swap ST(0) with ST(1)
a61af66fc99e Initial load
duke
parents:
diff changeset
10233 // fyl2x ; compute log_e(2) * log_2(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
10234 format %{ "FLDLN2 \t\t\t#Log_e\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10235 "FXCH \n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10236 "FYL2X \t\t\t# Q=Log_e*Log_2(x)"
a61af66fc99e Initial load
duke
parents:
diff changeset
10237 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10238 ins_encode( Opcode(0xD9), Opcode(0xED), // fldln2
a61af66fc99e Initial load
duke
parents:
diff changeset
10239 Opcode(0xD9), Opcode(0xC9), // fxch
a61af66fc99e Initial load
duke
parents:
diff changeset
10240 Opcode(0xD9), Opcode(0xF1)); // fyl2x
a61af66fc99e Initial load
duke
parents:
diff changeset
10241
a61af66fc99e Initial load
duke
parents:
diff changeset
10242 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10243 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10244
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10245 instruct logD_reg(regD dst, regD src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10246 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10247 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10248 // The source and result Double operands in XMM registers
a61af66fc99e Initial load
duke
parents:
diff changeset
10249 match(Set dst (LogD src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10250 // fldln2 ; push log_e(2) on the FPU stack; full 80-bit number
a61af66fc99e Initial load
duke
parents:
diff changeset
10251 // fyl2x ; compute log_e(2) * log_2(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
10252 format %{ "FLDLN2 \t\t\t#Log_e\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10253 "FYL2X \t\t\t# Q=Log_e*Log_2(x)"
a61af66fc99e Initial load
duke
parents:
diff changeset
10254 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10255 ins_encode( Opcode(0xD9), Opcode(0xED), // fldln2
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10256 Push_SrcD(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10257 Opcode(0xD9), Opcode(0xF1), // fyl2x
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10258 Push_ResultD(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10259 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10260 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10261
a61af66fc99e Initial load
duke
parents:
diff changeset
10262 //-------------Float Instructions-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
10263 // Float Math
a61af66fc99e Initial load
duke
parents:
diff changeset
10264
a61af66fc99e Initial load
duke
parents:
diff changeset
10265 // Code for float compare:
a61af66fc99e Initial load
duke
parents:
diff changeset
10266 // fcompp();
a61af66fc99e Initial load
duke
parents:
diff changeset
10267 // fwait(); fnstsw_ax();
a61af66fc99e Initial load
duke
parents:
diff changeset
10268 // sahf();
a61af66fc99e Initial load
duke
parents:
diff changeset
10269 // movl(dst, unordered_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
10270 // jcc(Assembler::parity, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
10271 // movl(dst, less_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
10272 // jcc(Assembler::below, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
10273 // movl(dst, equal_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
10274 // jcc(Assembler::equal, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
10275 // movl(dst, greater_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
10276 // exit:
a61af66fc99e Initial load
duke
parents:
diff changeset
10277
a61af66fc99e Initial load
duke
parents:
diff changeset
10278 // P6 version of float compare, sets condition codes in EFLAGS
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10279 instruct cmpFPR_cc_P6(eFlagsRegU cr, regFPR src1, regFPR src2, eAXRegI rax) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10280 predicate(VM_Version::supports_cmov() && UseSSE == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10281 match(Set cr (CmpF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10282 effect(KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
10283 ins_cost(150);
a61af66fc99e Initial load
duke
parents:
diff changeset
10284 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10285 "FUCOMIP ST,$src2 // P6 instruction\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10286 "JNP exit\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10287 "MOV ah,1 // saw a NaN, set CF (treat as LT)\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10288 "SAHF\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10289 "exit:\tNOP // avoid branch to branch" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10290 opcode(0xDF, 0x05); /* DF E8+i or DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10291 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10292 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10293 cmpF_P6_fixup );
a61af66fc99e Initial load
duke
parents:
diff changeset
10294 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10295 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10296
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10297 instruct cmpFPR_cc_P6CF(eFlagsRegUCF cr, regFPR src1, regFPR src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10298 predicate(VM_Version::supports_cmov() && UseSSE == 0);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10299 match(Set cr (CmpF src1 src2));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10300 ins_cost(100);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10301 format %{ "FLD $src1\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10302 "FUCOMIP ST,$src2 // P6 instruction" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10303 opcode(0xDF, 0x05); /* DF E8+i or DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10304 ins_encode( Push_Reg_DPR(src1),
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10305 OpcP, RegOpc(src2));
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10306 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10307 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10308
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10309
a61af66fc99e Initial load
duke
parents:
diff changeset
10310 // Compare & branch
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10311 instruct cmpFPR_cc(eFlagsRegU cr, regFPR src1, regFPR src2, eAXRegI rax) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10312 predicate(UseSSE == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10313 match(Set cr (CmpF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10314 effect(KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
10315 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
10316 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10317 "FCOMp $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10318 "FNSTSW AX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10319 "TEST AX,0x400\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10320 "JZ,s flags\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10321 "MOV AH,1\t# unordered treat as LT\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10322 "flags:\tSAHF" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10323 opcode(0xD8, 0x3); /* D8 D8+i or D8 /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10324 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10325 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10326 fpu_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
10327 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10328 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10329
a61af66fc99e Initial load
duke
parents:
diff changeset
10330 // Compare vs zero into -1,0,1
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
10331 instruct cmpFPR_0(rRegI dst, regFPR src1, immFPR0 zero, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10332 predicate(UseSSE == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10333 match(Set dst (CmpF3 src1 zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
10334 effect(KILL cr, KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
10335 ins_cost(280);
a61af66fc99e Initial load
duke
parents:
diff changeset
10336 format %{ "FTSTF $dst,$src1" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10337 opcode(0xE4, 0xD9);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10338 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10339 OpcS, OpcP, PopFPU,
a61af66fc99e Initial load
duke
parents:
diff changeset
10340 CmpF_Result(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
10341 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10342 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10343
a61af66fc99e Initial load
duke
parents:
diff changeset
10344 // Compare into -1,0,1
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
10345 instruct cmpFPR_reg(rRegI dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10346 predicate(UseSSE == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10347 match(Set dst (CmpF3 src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10348 effect(KILL cr, KILL rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
10349 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
10350 format %{ "FCMPF $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10351 opcode(0xD8, 0x3); /* D8 D8+i or D8 /3 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10352 ins_encode( Push_Reg_DPR(src1),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10353 OpcP, RegOpc(src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10354 CmpF_Result(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
10355 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10356 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10357
a61af66fc99e Initial load
duke
parents:
diff changeset
10358 // float compare and set condition codes in EFLAGS by XMM regs
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10359 instruct cmpF_cc(eFlagsRegU cr, regF src1, regF src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10360 predicate(UseSSE>=1);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10361 match(Set cr (CmpF src1 src2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10362 ins_cost(145);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10363 format %{ "UCOMISS $src1,$src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10364 "JNP,s exit\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10365 "PUSHF\t# saw NaN, set CF\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10366 "AND [rsp], #0xffffff2b\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10367 "POPF\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10368 "exit:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10369 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10370 __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10371 emit_cmpfp_fixup(_masm);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10372 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10373 ins_pipe( pipe_slow );
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10374 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10375
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10376 instruct cmpF_ccCF(eFlagsRegUCF cr, regF src1, regF src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10377 predicate(UseSSE>=1);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10378 match(Set cr (CmpF src1 src2));
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10379 ins_cost(100);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10380 format %{ "UCOMISS $src1,$src2" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10381 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10382 __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10383 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10384 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10385 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10386
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10387 // float compare and set condition codes in EFLAGS by XMM regs
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10388 instruct cmpF_ccmem(eFlagsRegU cr, regF src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10389 predicate(UseSSE>=1);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10390 match(Set cr (CmpF src1 (LoadF src2)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10391 ins_cost(165);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10392 format %{ "UCOMISS $src1,$src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10393 "JNP,s exit\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10394 "PUSHF\t# saw NaN, set CF\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10395 "AND [rsp], #0xffffff2b\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10396 "POPF\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10397 "exit:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10398 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10399 __ ucomiss($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10400 emit_cmpfp_fixup(_masm);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10401 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10402 ins_pipe( pipe_slow );
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10403 %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10404
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10405 instruct cmpF_ccmemCF(eFlagsRegUCF cr, regF src1, memory src2) %{
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10406 predicate(UseSSE>=1);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10407 match(Set cr (CmpF src1 (LoadF src2)));
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10408 ins_cost(100);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10409 format %{ "UCOMISS $src1,$src2" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10410 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10411 __ ucomiss($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10412 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10413 ins_pipe( pipe_slow );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10414 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
10415
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10416 // Compare into -1,0,1 in XMM
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10417 instruct cmpF_reg(xRegI dst, regF src1, regF src2, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10418 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10419 match(Set dst (CmpF3 src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10420 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10421 ins_cost(255);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10422 format %{ "UCOMISS $src1, $src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10423 "MOV $dst, #-1\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10424 "JP,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10425 "JB,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10426 "SETNE $dst\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10427 "MOVZB $dst, $dst\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10428 "done:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10429 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10430 __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10431 emit_cmpfp3(_masm, $dst$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10432 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10433 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10434 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10435
a61af66fc99e Initial load
duke
parents:
diff changeset
10436 // Compare into -1,0,1 in XMM and memory
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10437 instruct cmpF_regmem(xRegI dst, regF src1, memory src2, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10438 predicate(UseSSE>=1);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10439 match(Set dst (CmpF3 src1 (LoadF src2)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10440 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10441 ins_cost(275);
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10442 format %{ "UCOMISS $src1, $src2\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10443 "MOV $dst, #-1\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10444 "JP,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10445 "JB,s done\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10446 "SETNE $dst\n\t"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10447 "MOVZB $dst, $dst\n"
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10448 "done:" %}
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10449 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10450 __ ucomiss($src1$$XMMRegister, $src2$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10451 emit_cmpfp3(_masm, $dst$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10452 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10453 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10454 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10455
a61af66fc99e Initial load
duke
parents:
diff changeset
10456 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10457 instruct subFPR24_reg(stackSlotF dst, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10458 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10459 match(Set dst (SubF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10460
a61af66fc99e Initial load
duke
parents:
diff changeset
10461 format %{ "FSUB $dst,$src1 - $src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10462 opcode(0xD8, 0x4); /* D8 E0+i or D8 /4 mod==0x3 ;; result in TOS */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10463 ins_encode( Push_Reg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10464 OpcReg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10465 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10466 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10467 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10468 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10469 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10470 instruct subFPR_reg(regFPR dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10471 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10472 match(Set dst (SubF dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10473
a61af66fc99e Initial load
duke
parents:
diff changeset
10474 format %{ "FSUB $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10475 opcode(0xDE, 0x5); /* DE E8+i or DE /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10476 ins_encode( Push_Reg_FPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10477 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10478 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10479 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10480
a61af66fc99e Initial load
duke
parents:
diff changeset
10481 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10482 instruct addFPR24_reg(stackSlotF dst, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10483 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10484 match(Set dst (AddF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10485
a61af66fc99e Initial load
duke
parents:
diff changeset
10486 format %{ "FADD $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10487 opcode(0xD8, 0x0); /* D8 C0+i */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10488 ins_encode( Push_Reg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10489 OpcReg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10490 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10491 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10492 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10493 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10494 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10495 instruct addFPR_reg(regFPR dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10496 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10497 match(Set dst (AddF dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10498
a61af66fc99e Initial load
duke
parents:
diff changeset
10499 format %{ "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10500 "FADDp $dst,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10501 opcode(0xDE, 0x0); /* DE C0+i or DE /0*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10502 ins_encode( Push_Reg_FPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10503 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10504 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10505 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10506
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10507 instruct absFPR_reg(regFPR1 dst, regFPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10508 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10509 match(Set dst (AbsF src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10510 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
10511 format %{ "FABS" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10512 opcode(0xE1, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
10513 ins_encode( OpcS, OpcP );
a61af66fc99e Initial load
duke
parents:
diff changeset
10514 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10515 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10516
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10517 instruct negFPR_reg(regFPR1 dst, regFPR1 src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10518 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10519 match(Set dst (NegF src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10520 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
10521 format %{ "FCHS" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10522 opcode(0xE0, 0xD9);
a61af66fc99e Initial load
duke
parents:
diff changeset
10523 ins_encode( OpcS, OpcP );
a61af66fc99e Initial load
duke
parents:
diff changeset
10524 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10525 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10526
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10527 // Cisc-alternate to addFPR_reg
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10528 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10529 instruct addFPR24_reg_mem(stackSlotF dst, regFPR src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10530 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10531 match(Set dst (AddF src1 (LoadF src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
10532
a61af66fc99e Initial load
duke
parents:
diff changeset
10533 format %{ "FLD $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10534 "FADD ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10535 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10536 opcode(0xD8, 0x0, 0xD9); /* D8 C0+i */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10537 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10538 OpcReg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10539 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10540 ins_pipe( fpu_mem_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10541 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10542 //
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10543 // Cisc-alternate to addFPR_reg
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10544 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10545 instruct addFPR_reg_mem(regFPR dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10546 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10547 match(Set dst (AddF dst (LoadF src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
10548
a61af66fc99e Initial load
duke
parents:
diff changeset
10549 format %{ "FADD $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10550 opcode(0xDE, 0x0, 0xD9); /* DE C0+i or DE /0*/ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10551 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src),
a61af66fc99e Initial load
duke
parents:
diff changeset
10552 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10553 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10554 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10555
a61af66fc99e Initial load
duke
parents:
diff changeset
10556 // // Following two instructions for _222_mpegaudio
a61af66fc99e Initial load
duke
parents:
diff changeset
10557 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10558 instruct addFPR24_mem_reg(stackSlotF dst, regFPR src2, memory src1 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10559 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10560 match(Set dst (AddF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10561
a61af66fc99e Initial load
duke
parents:
diff changeset
10562 format %{ "FADD $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10563 opcode(0xD8, 0x0, 0xD9); /* D8 C0+i */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10564 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src1),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10565 OpcReg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10566 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10567 ins_pipe( fpu_mem_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10568 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10569
a61af66fc99e Initial load
duke
parents:
diff changeset
10570 // Cisc-spill variant
a61af66fc99e Initial load
duke
parents:
diff changeset
10571 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10572 instruct addFPR24_mem_cisc(stackSlotF dst, memory src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10573 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10574 match(Set dst (AddF src1 (LoadF src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
10575
a61af66fc99e Initial load
duke
parents:
diff changeset
10576 format %{ "FADD $dst,$src1,$src2 cisc" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10577 opcode(0xD8, 0x0, 0xD9); /* D8 C0+i */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10578 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10579 set_instruction_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
10580 OpcP, RMopc_Mem(secondary,src1),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10581 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10582 ins_pipe( fpu_mem_mem_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10583 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10584
a61af66fc99e Initial load
duke
parents:
diff changeset
10585 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10586 instruct addFPR24_mem_mem(stackSlotF dst, memory src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10587 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10588 match(Set dst (AddF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10589
a61af66fc99e Initial load
duke
parents:
diff changeset
10590 format %{ "FADD $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10591 opcode(0xD8, 0x0, 0xD9); /* D8 /0 */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10592 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10593 set_instruction_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
10594 OpcP, RMopc_Mem(secondary,src1),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10595 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10596 ins_pipe( fpu_mem_mem_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10597 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10598
a61af66fc99e Initial load
duke
parents:
diff changeset
10599
a61af66fc99e Initial load
duke
parents:
diff changeset
10600 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10601 instruct addFPR24_reg_imm(stackSlotF dst, regFPR src, immFPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10602 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10603 match(Set dst (AddF src con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10604 format %{ "FLD $src\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10605 "FADD_S [$constantaddress]\t# load from constant table: float=$con\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10606 "FSTP_S $dst" %}
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10607 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10608 __ fld_s($src$$reg - 1); // FLD ST(i-1)
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10609 __ fadd_s($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10610 __ fstp_s(Address(rsp, $dst$$disp));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10611 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10612 ins_pipe(fpu_mem_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10613 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10614 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10615 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10616 instruct addFPR_reg_imm(regFPR dst, regFPR src, immFPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10617 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10618 match(Set dst (AddF src con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10619 format %{ "FLD $src\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10620 "FADD_S [$constantaddress]\t# load from constant table: float=$con\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10621 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10622 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10623 __ fld_s($src$$reg - 1); // FLD ST(i-1)
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10624 __ fadd_s($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10625 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10626 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10627 ins_pipe(fpu_reg_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10628 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10629
a61af66fc99e Initial load
duke
parents:
diff changeset
10630 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10631 instruct mulFPR24_reg(stackSlotF dst, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10632 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10633 match(Set dst (MulF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10634
a61af66fc99e Initial load
duke
parents:
diff changeset
10635 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10636 "FMUL $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10637 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10638 opcode(0xD8, 0x1); /* D8 C8+i or D8 /1 ;; result in TOS */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10639 ins_encode( Push_Reg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10640 OpcReg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10641 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10642 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10643 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10644 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10645 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10646 instruct mulFPR_reg(regFPR dst, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10647 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10648 match(Set dst (MulF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10649
a61af66fc99e Initial load
duke
parents:
diff changeset
10650 format %{ "FLD $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10651 "FMUL $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10652 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10653 opcode(0xD8, 0x1); /* D8 C8+i */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10654 ins_encode( Push_Reg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10655 OpcReg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10656 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10657 ins_pipe( fpu_reg_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10658 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10659
a61af66fc99e Initial load
duke
parents:
diff changeset
10660
a61af66fc99e Initial load
duke
parents:
diff changeset
10661 // Spill to obtain 24-bit precision
a61af66fc99e Initial load
duke
parents:
diff changeset
10662 // Cisc-alternate to reg-reg multiply
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10663 instruct mulFPR24_reg_mem(stackSlotF dst, regFPR src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10664 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10665 match(Set dst (MulF src1 (LoadF src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
10666
a61af66fc99e Initial load
duke
parents:
diff changeset
10667 format %{ "FLD_S $src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10668 "FMUL $src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10669 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10670 opcode(0xD8, 0x1, 0xD9); /* D8 C8+i or DE /1*/ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10671 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10672 OpcReg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10673 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10674 ins_pipe( fpu_mem_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10675 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10676 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10677 // This instruction does not round to 24-bits
a61af66fc99e Initial load
duke
parents:
diff changeset
10678 // Cisc-alternate to reg-reg multiply
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10679 instruct mulFPR_reg_mem(regFPR dst, regFPR src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10680 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10681 match(Set dst (MulF src1 (LoadF src2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
10682
a61af66fc99e Initial load
duke
parents:
diff changeset
10683 format %{ "FMUL $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10684 opcode(0xD8, 0x1, 0xD9); /* D8 C8+i */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10685 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10686 OpcReg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10687 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10688 ins_pipe( fpu_reg_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10689 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10690
a61af66fc99e Initial load
duke
parents:
diff changeset
10691 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10692 instruct mulFPR24_mem_mem(stackSlotF dst, memory src1, memory src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10693 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10694 match(Set dst (MulF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10695
a61af66fc99e Initial load
duke
parents:
diff changeset
10696 format %{ "FMUL $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10697 opcode(0xD8, 0x1, 0xD9); /* D8 /1 */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10698 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,src2),
a61af66fc99e Initial load
duke
parents:
diff changeset
10699 set_instruction_start,
a61af66fc99e Initial load
duke
parents:
diff changeset
10700 OpcP, RMopc_Mem(secondary,src1),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10701 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10702 ins_pipe( fpu_mem_mem_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10703 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10704
a61af66fc99e Initial load
duke
parents:
diff changeset
10705 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10706 instruct mulFPR24_reg_imm(stackSlotF dst, regFPR src, immFPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10707 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10708 match(Set dst (MulF src con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10709
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10710 format %{ "FLD $src\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10711 "FMUL_S [$constantaddress]\t# load from constant table: float=$con\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10712 "FSTP_S $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10713 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10714 __ fld_s($src$$reg - 1); // FLD ST(i-1)
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10715 __ fmul_s($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10716 __ fstp_s(Address(rsp, $dst$$disp));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10717 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10718 ins_pipe(fpu_mem_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10719 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10720 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10721 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10722 instruct mulFPR_reg_imm(regFPR dst, regFPR src, immFPR con) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10723 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10724 match(Set dst (MulF src con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10725
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10726 format %{ "FLD $src\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10727 "FMUL_S [$constantaddress]\t# load from constant table: float=$con\n\t"
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10728 "FSTP $dst" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10729 ins_encode %{
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10730 __ fld_s($src$$reg - 1); // FLD ST(i-1)
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10731 __ fmul_s($constantaddress($con));
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10732 __ fstp_d($dst$$reg);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10733 %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
10734 ins_pipe(fpu_reg_reg_con);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10735 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10736
a61af66fc99e Initial load
duke
parents:
diff changeset
10737
a61af66fc99e Initial load
duke
parents:
diff changeset
10738 //
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10739 // MACRO1 -- subsume unshared load into mulFPR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10740 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10741 instruct mulFPR_reg_load1(regFPR dst, regFPR src, memory mem1 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10742 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10743 match(Set dst (MulF (LoadF mem1) src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10744
a61af66fc99e Initial load
duke
parents:
diff changeset
10745 format %{ "FLD $mem1 ===MACRO1===\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10746 "FMUL ST,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10747 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10748 opcode(0xD8, 0x1, 0xD9); /* D8 C8+i or D8 /1 */ /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10749 ins_encode( Opcode(tertiary), RMopc_Mem(0x00,mem1),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10750 OpcReg_FPR(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10751 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10752 ins_pipe( fpu_reg_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
10753 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10754 //
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10755 // MACRO2 -- addFPR a mulFPR which subsumed an unshared load
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10756 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10757 instruct addFPR_mulFPR_reg_load1(regFPR dst, memory mem1, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10758 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10759 match(Set dst (AddF (MulF (LoadF mem1) src1) src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10760 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
10761
a61af66fc99e Initial load
duke
parents:
diff changeset
10762 format %{ "FLD $mem1 ===MACRO2===\n\t"
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10763 "FMUL ST,$src1 subsume mulFPR left load\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10764 "FADD ST,$src2\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10765 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10766 opcode(0xD9); /* LoadF D9 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
10767 ins_encode( OpcP, RMopc_Mem(0x00,mem1),
a61af66fc99e Initial load
duke
parents:
diff changeset
10768 FMul_ST_reg(src1),
a61af66fc99e Initial load
duke
parents:
diff changeset
10769 FAdd_ST_reg(src2),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10770 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10771 ins_pipe( fpu_reg_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10772 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10773
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10774 // MACRO3 -- addFPR a mulFPR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10775 // This instruction does not round to 24-bits. It is a '2-address'
a61af66fc99e Initial load
duke
parents:
diff changeset
10776 // instruction in that the result goes back to src2. This eliminates
a61af66fc99e Initial load
duke
parents:
diff changeset
10777 // a move from the macro; possibly the register allocator will have
a61af66fc99e Initial load
duke
parents:
diff changeset
10778 // to add it back (and maybe not).
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10779 instruct addFPR_mulFPR_reg(regFPR src2, regFPR src1, regFPR src0) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10780 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10781 match(Set src2 (AddF (MulF src0 src1) src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10782
a61af66fc99e Initial load
duke
parents:
diff changeset
10783 format %{ "FLD $src0 ===MACRO3===\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10784 "FMUL ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10785 "FADDP $src2,ST" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10786 opcode(0xD9); /* LoadF D9 /0 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10787 ins_encode( Push_Reg_FPR(src0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10788 FMul_ST_reg(src1),
a61af66fc99e Initial load
duke
parents:
diff changeset
10789 FAddP_reg_ST(src2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10790 ins_pipe( fpu_reg_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10791 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10792
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10793 // MACRO4 -- divFPR subFPR
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10794 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10795 instruct subFPR_divFPR_reg(regFPR dst, regFPR src1, regFPR src2, regFPR src3) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10796 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10797 match(Set dst (DivF (SubF src2 src1) src3));
a61af66fc99e Initial load
duke
parents:
diff changeset
10798
a61af66fc99e Initial load
duke
parents:
diff changeset
10799 format %{ "FLD $src2 ===MACRO4===\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10800 "FSUB ST,$src1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10801 "FDIV ST,$src3\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10802 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10803 opcode(0xDE, 0x7); /* DE F8+i or DE /7*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10804 ins_encode( Push_Reg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10805 subFPR_divFPR_encode(src1,src3),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10806 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10807 ins_pipe( fpu_reg_reg_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10808 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10809
a61af66fc99e Initial load
duke
parents:
diff changeset
10810 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10811 instruct divFPR24_reg(stackSlotF dst, regFPR src1, regFPR src2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10812 predicate(UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10813 match(Set dst (DivF src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
10814
a61af66fc99e Initial load
duke
parents:
diff changeset
10815 format %{ "FDIV $dst,$src1,$src2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10816 opcode(0xD8, 0x6); /* D8 F0+i or DE /6*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10817 ins_encode( Push_Reg_FPR(src1),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10818 OpcReg_FPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10819 Pop_Mem_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10820 ins_pipe( fpu_mem_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10821 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10822 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10823 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10824 instruct divFPR_reg(regFPR dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10825 predicate(UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10826 match(Set dst (DivF dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10827
a61af66fc99e Initial load
duke
parents:
diff changeset
10828 format %{ "FDIV $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10829 opcode(0xDE, 0x7); /* DE F8+i or DE /7*/
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10830 ins_encode( Push_Reg_FPR(src),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10831 OpcP, RegOpc(dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
10832 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10833 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10834
a61af66fc99e Initial load
duke
parents:
diff changeset
10835
a61af66fc99e Initial load
duke
parents:
diff changeset
10836 // Spill to obtain 24-bit precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10837 instruct modFPR24_reg(stackSlotF dst, regFPR src1, regFPR src2, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10838 predicate( UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10839 match(Set dst (ModF src1 src2));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10840 effect(KILL rax, KILL cr); // emitModDPR() uses EAX and EFLAGS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10841
a61af66fc99e Initial load
duke
parents:
diff changeset
10842 format %{ "FMOD $dst,$src1,$src2" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10843 ins_encode( Push_Reg_Mod_DPR(src1, src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10844 emitModDPR(),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10845 Push_Result_Mod_DPR(src2),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10846 Pop_Mem_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10847 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10848 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10849 //
a61af66fc99e Initial load
duke
parents:
diff changeset
10850 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10851 instruct modFPR_reg(regFPR dst, regFPR src, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10852 predicate( UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
10853 match(Set dst (ModF dst src));
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10854 effect(KILL rax, KILL cr); // emitModDPR() uses EAX and EFLAGS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10855
a61af66fc99e Initial load
duke
parents:
diff changeset
10856 format %{ "FMOD $dst,$src" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10857 ins_encode(Push_Reg_Mod_DPR(dst, src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10858 emitModDPR(),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10859 Push_Result_Mod_DPR(src),
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10860 Pop_Reg_FPR(dst));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10861 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10862 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10863
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10864 instruct modF_reg(regF dst, regF src0, regF src1, eAXRegI rax, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10865 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10866 match(Set dst (ModF src0 src1));
a61af66fc99e Initial load
duke
parents:
diff changeset
10867 effect(KILL rax, KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
10868 format %{ "SUB ESP,4\t # FMOD\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10869 "\tMOVSS [ESP+0],$src1\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10870 "\tFLD_S [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10871 "\tMOVSS [ESP+0],$src0\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10872 "\tFLD_S [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10873 "loop:\tFPREM\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10874 "\tFWAIT\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10875 "\tFNSTSW AX\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10876 "\tSAHF\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10877 "\tJP loop\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10878 "\tFSTP_S [ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10879 "\tMOVSS $dst,[ESP+0]\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10880 "\tADD ESP,4\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
10881 "\tFSTP ST0\t # Restore FPU Stack"
a61af66fc99e Initial load
duke
parents:
diff changeset
10882 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10883 ins_cost(250);
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10884 ins_encode( Push_ModF_encoding(src0, src1), emitModDPR(), Push_ResultF(dst,0x4), PopFPU);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10885 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10886 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10887
a61af66fc99e Initial load
duke
parents:
diff changeset
10888
a61af66fc99e Initial load
duke
parents:
diff changeset
10889 //----------Arithmetic Conversion Instructions---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
10890 // The conversions operations are all Alpha sorted. Please keep it that way!
a61af66fc99e Initial load
duke
parents:
diff changeset
10891
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10892 instruct roundFloat_mem_reg(stackSlotF dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10893 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10894 match(Set dst (RoundFloat src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10895 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
10896 format %{ "FST_S $dst,$src\t# F-round" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10897 ins_encode( Pop_Mem_Reg_FPR(dst, src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10898 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10899 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10900
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10901 instruct roundDouble_mem_reg(stackSlotD dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10902 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10903 match(Set dst (RoundDouble src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10904 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
10905 format %{ "FST_D $dst,$src\t# D-round" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10906 ins_encode( Pop_Mem_Reg_DPR(dst, src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10907 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10908 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10909
a61af66fc99e Initial load
duke
parents:
diff changeset
10910 // Force rounding to 24-bit precision and 6-bit exponent
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10911 instruct convDPR2FPR_reg(stackSlotF dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10912 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10913 match(Set dst (ConvD2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10914 format %{ "FST_S $dst,$src\t# F-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10915 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
10916 roundFloat_mem_reg(dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
10917 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10918 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10919
a61af66fc99e Initial load
duke
parents:
diff changeset
10920 // Force rounding to 24-bit precision and 6-bit exponent
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10921 instruct convDPR2F_reg(regF dst, regDPR src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10922 predicate(UseSSE==1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10923 match(Set dst (ConvD2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10924 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
10925 format %{ "SUB ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10926 "FST_S [ESP],$src\t# F-round\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10927 "MOVSS $dst,[ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10928 "ADD ESP,4" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10929 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10930 __ subptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10931 if ($src$$reg != FPR1L_enc) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10932 __ fld_s($src$$reg-1);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10933 __ fstp_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10934 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10935 __ fst_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10936 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10937 __ movflt($dst$$XMMRegister, Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10938 __ addptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10939 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10940 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10941 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10942
a61af66fc99e Initial load
duke
parents:
diff changeset
10943 // Force rounding double precision to single precision
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10944 instruct convD2F_reg(regF dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10945 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10946 match(Set dst (ConvD2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10947 format %{ "CVTSD2SS $dst,$src\t# F-round" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10948 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10949 __ cvtsd2ss ($dst$$XMMRegister, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10950 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10951 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10952 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10953
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10954 instruct convFPR2DPR_reg_reg(regDPR dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10955 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
10956 match(Set dst (ConvF2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10957 format %{ "FST_S $dst,$src\t# D-round" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10958 ins_encode( Pop_Reg_Reg_DPR(dst, src));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10959 ins_pipe( fpu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
10960 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10961
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10962 instruct convFPR2D_reg(stackSlotD dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10963 predicate(UseSSE==1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10964 match(Set dst (ConvF2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10965 format %{ "FST_D $dst,$src\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10966 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
10967 roundDouble_mem_reg(dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
10968 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10969 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10970
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10971 instruct convF2DPR_reg(regDPR dst, regF src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10972 predicate(UseSSE==1);
a61af66fc99e Initial load
duke
parents:
diff changeset
10973 match(Set dst (ConvF2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10974 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
10975 format %{ "SUB ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10976 "MOVSS [ESP] $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10977 "FLD_S [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10978 "ADD ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
10979 "FSTP $dst\t# D-round" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10980 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10981 __ subptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10982 __ movflt(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10983 __ fld_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10984 __ addptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10985 __ fstp_d($dst$$reg);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10986 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10987 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10988 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10989
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
10990 instruct convF2D_reg(regD dst, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10991 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
10992 match(Set dst (ConvF2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
10993 format %{ "CVTSS2SD $dst,$src\t# D-round" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10994 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10995 __ cvtss2sd ($dst$$XMMRegister, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
10996 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
10997 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
10998 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
10999
a61af66fc99e Initial load
duke
parents:
diff changeset
11000 // Convert a double to an int. If the double is a NAN, stuff a zero in instead.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11001 instruct convDPR2I_reg_reg( eAXRegI dst, eDXRegI tmp, regDPR src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11002 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11003 match(Set dst (ConvD2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11004 effect( KILL tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11005 format %{ "FLD $src\t# Convert double to int \n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11006 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11007 "SUB ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11008 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11009 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11010 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11011 "CMP EAX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11012 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11013 "FLD_D $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11014 "CALL d2i_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11015 "fast:" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11016 ins_encode( Push_Reg_DPR(src), DPR2I_encoding(src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11017 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11018 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11019
a61af66fc99e Initial load
duke
parents:
diff changeset
11020 // Convert a double to an int. If the double is a NAN, stuff a zero in instead.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11021 instruct convD2I_reg_reg( eAXRegI dst, eDXRegI tmp, regD src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11022 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11023 match(Set dst (ConvD2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11024 effect( KILL tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11025 format %{ "CVTTSD2SI $dst, $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11026 "CMP $dst,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11027 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11028 "SUB ESP, 8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11029 "MOVSD [ESP], $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11030 "FLD_D [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11031 "ADD ESP, 8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11032 "CALL d2i_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11033 "fast:" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11034 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11035 Label fast;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11036 __ cvttsd2sil($dst$$Register, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11037 __ cmpl($dst$$Register, 0x80000000);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11038 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11039 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11040 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11041 __ fld_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11042 __ addptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11043 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::d2i_wrapper())));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11044 __ bind(fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11045 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11046 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11047 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11048
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11049 instruct convDPR2L_reg_reg( eADXRegL dst, regDPR src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11050 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11051 match(Set dst (ConvD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11052 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11053 format %{ "FLD $src\t# Convert double to long\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11054 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11055 "SUB ESP,8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11056 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11057 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11058 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11059 "POP EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11060 "CMP EDX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11061 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11062 "TEST EAX,EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11063 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11064 "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11065 "CALL d2l_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11066 "fast:" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11067 ins_encode( Push_Reg_DPR(src), DPR2L_encoding(src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11068 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11069 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11070
a61af66fc99e Initial load
duke
parents:
diff changeset
11071 // XMM lacks a float/double->long conversion, so use the old FPU stack.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11072 instruct convD2L_reg_reg( eADXRegL dst, regD src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11073 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11074 match(Set dst (ConvD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11075 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11076 format %{ "SUB ESP,8\t# Convert double to long\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11077 "MOVSD [ESP],$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11078 "FLD_D [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11079 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11080 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11081 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11082 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11083 "POP EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11084 "CMP EDX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11085 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11086 "TEST EAX,EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11087 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11088 "SUB ESP,8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11089 "MOVSD [ESP],$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11090 "FLD_D [ESP]\n\t"
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11091 "ADD ESP,8\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11092 "CALL d2l_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11093 "fast:" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11094 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11095 Label fast;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11096 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11097 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11098 __ fld_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11099 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_trunc()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11100 __ fistp_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11101 // Restore the rounding mode, mask the exception
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11102 if (Compile::current()->in_24_bit_fp_mode()) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11103 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11104 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11105 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11106 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11107 // Load the converted long, adjust CPU stack
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11108 __ pop(rax);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11109 __ pop(rdx);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11110 __ cmpl(rdx, 0x80000000);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11111 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11112 __ testl(rax, rax);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11113 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11114 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11115 __ movdbl(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11116 __ fld_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11117 __ addptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11118 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::d2l_wrapper())));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11119 __ bind(fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11120 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11121 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11122 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11123
a61af66fc99e Initial load
duke
parents:
diff changeset
11124 // Convert a double to an int. Java semantics require we do complex
a61af66fc99e Initial load
duke
parents:
diff changeset
11125 // manglations in the corner cases. So we set the rounding mode to
a61af66fc99e Initial load
duke
parents:
diff changeset
11126 // 'zero', store the darned double down as an int, and reset the
a61af66fc99e Initial load
duke
parents:
diff changeset
11127 // rounding mode to 'nearest'. The hardware stores a flag value down
a61af66fc99e Initial load
duke
parents:
diff changeset
11128 // if we would overflow or converted a NAN; we check for this and
a61af66fc99e Initial load
duke
parents:
diff changeset
11129 // and go the slow path if needed.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11130 instruct convFPR2I_reg_reg(eAXRegI dst, eDXRegI tmp, regFPR src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11131 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
11132 match(Set dst (ConvF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11133 effect( KILL tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11134 format %{ "FLD $src\t# Convert float to int \n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11135 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11136 "SUB ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11137 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11138 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11139 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11140 "CMP EAX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11141 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11142 "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11143 "CALL d2i_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11144 "fast:" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11145 // DPR2I_encoding works for FPR2I
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11146 ins_encode( Push_Reg_FPR(src), DPR2I_encoding(src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11147 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11148 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11149
a61af66fc99e Initial load
duke
parents:
diff changeset
11150 // Convert a float in xmm to an int reg.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11151 instruct convF2I_reg(eAXRegI dst, eDXRegI tmp, regF src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11152 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11153 match(Set dst (ConvF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11154 effect( KILL tmp, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11155 format %{ "CVTTSS2SI $dst, $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11156 "CMP $dst,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11157 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11158 "SUB ESP, 4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11159 "MOVSS [ESP], $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11160 "FLD [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11161 "ADD ESP, 4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11162 "CALL d2i_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11163 "fast:" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11164 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11165 Label fast;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11166 __ cvttss2sil($dst$$Register, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11167 __ cmpl($dst$$Register, 0x80000000);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11168 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11169 __ subptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11170 __ movflt(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11171 __ fld_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11172 __ addptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11173 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::d2i_wrapper())));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11174 __ bind(fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11175 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11176 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11177 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11178
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11179 instruct convFPR2L_reg_reg( eADXRegL dst, regFPR src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11180 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
11181 match(Set dst (ConvF2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11182 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11183 format %{ "FLD $src\t# Convert float to long\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11184 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11185 "SUB ESP,8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11186 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11187 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11188 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11189 "POP EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11190 "CMP EDX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11191 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11192 "TEST EAX,EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11193 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11194 "FLD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11195 "CALL d2l_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11196 "fast:" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11197 // DPR2L_encoding works for FPR2L
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11198 ins_encode( Push_Reg_FPR(src), DPR2L_encoding(src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11199 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11200 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11201
a61af66fc99e Initial load
duke
parents:
diff changeset
11202 // XMM lacks a float/double->long conversion, so use the old FPU stack.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11203 instruct convF2L_reg_reg( eADXRegL dst, regF src, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11204 predicate (UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11205 match(Set dst (ConvF2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11206 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11207 format %{ "SUB ESP,8\t# Convert float to long\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11208 "MOVSS [ESP],$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11209 "FLD_S [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11210 "FLDCW trunc mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11211 "FISTp [ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11212 "FLDCW std/24-bit mode\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11213 "POP EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11214 "POP EDX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11215 "CMP EDX,0x80000000\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11216 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11217 "TEST EAX,EAX\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11218 "JNE,s fast\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11219 "SUB ESP,4\t# Convert float to long\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11220 "MOVSS [ESP],$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11221 "FLD_S [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11222 "ADD ESP,4\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11223 "CALL d2l_wrapper\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
11224 "fast:" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11225 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11226 Label fast;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11227 __ subptr(rsp, 8);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11228 __ movflt(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11229 __ fld_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11230 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_trunc()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11231 __ fistp_d(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11232 // Restore the rounding mode, mask the exception
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11233 if (Compile::current()->in_24_bit_fp_mode()) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11234 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11235 } else {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11236 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11237 }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11238 // Load the converted long, adjust CPU stack
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11239 __ pop(rax);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11240 __ pop(rdx);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11241 __ cmpl(rdx, 0x80000000);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11242 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11243 __ testl(rax, rax);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11244 __ jccb(Assembler::notEqual, fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11245 __ subptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11246 __ movflt(Address(rsp, 0), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11247 __ fld_s(Address(rsp, 0));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11248 __ addptr(rsp, 4);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11249 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::d2l_wrapper())));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11250 __ bind(fast);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11251 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11252 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11253 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11254
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11255 instruct convI2DPR_reg(regDPR dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11256 predicate( UseSSE<=1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
11257 match(Set dst (ConvI2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11258 format %{ "FILD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11259 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11260 opcode(0xDB, 0x0); /* DB /0 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11261 ins_encode(Push_Mem_I(src), Pop_Reg_DPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11262 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11263 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11264
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11265 instruct convI2D_reg(regD dst, rRegI src) %{
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11266 predicate( UseSSE>=2 && !UseXmmI2D );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11267 match(Set dst (ConvI2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11268 format %{ "CVTSI2SD $dst,$src" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11269 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11270 __ cvtsi2sdl ($dst$$XMMRegister, $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11271 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11272 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11273 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11274
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11275 instruct convI2D_mem(regD dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11276 predicate( UseSSE>=2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
11277 match(Set dst (ConvI2D (LoadI mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11278 format %{ "CVTSI2SD $dst,$mem" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11279 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11280 __ cvtsi2sdl ($dst$$XMMRegister, $mem$$Address);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11281 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11282 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11283 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11284
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11285 instruct convXI2D_reg(regD dst, rRegI src)
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11286 %{
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11287 predicate( UseSSE>=2 && UseXmmI2D );
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11288 match(Set dst (ConvI2D src));
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11289
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11290 format %{ "MOVD $dst,$src\n\t"
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11291 "CVTDQ2PD $dst,$dst\t# i2d" %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11292 ins_encode %{
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
11293 __ movdl($dst$$XMMRegister, $src$$Register);
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11294 __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister);
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11295 %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11296 ins_pipe(pipe_slow); // XXX
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11297 %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11298
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11299 instruct convI2DPR_mem(regDPR dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11300 predicate( UseSSE<=1 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
11301 match(Set dst (ConvI2D (LoadI mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11302 format %{ "FILD $mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11303 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11304 opcode(0xDB); /* DB /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11305 ins_encode( OpcP, RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11306 Pop_Reg_DPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11307 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11308 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11309
a61af66fc99e Initial load
duke
parents:
diff changeset
11310 // Convert a byte to a float; no rounding step needed.
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11311 instruct conv24I2FPR_reg(regFPR dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11312 predicate( UseSSE==0 && n->in(1)->Opcode() == Op_AndI && n->in(1)->in(2)->is_Con() && n->in(1)->in(2)->get_int() == 255 );
a61af66fc99e Initial load
duke
parents:
diff changeset
11313 match(Set dst (ConvI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11314 format %{ "FILD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11315 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11316
a61af66fc99e Initial load
duke
parents:
diff changeset
11317 opcode(0xDB, 0x0); /* DB /0 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11318 ins_encode(Push_Mem_I(src), Pop_Reg_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11319 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11320 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11321
a61af66fc99e Initial load
duke
parents:
diff changeset
11322 // In 24-bit mode, force exponent rounding by storing back out
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11323 instruct convI2FPR_SSF(stackSlotF dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11324 predicate( UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
11325 match(Set dst (ConvI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11326 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
11327 format %{ "FILD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11328 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11329 opcode(0xDB, 0x0); /* DB /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11330 ins_encode( Push_Mem_I(src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11331 Pop_Mem_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11332 ins_pipe( fpu_mem_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11333 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11334
a61af66fc99e Initial load
duke
parents:
diff changeset
11335 // In 24-bit mode, force exponent rounding by storing back out
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11336 instruct convI2FPR_SSF_mem(stackSlotF dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11337 predicate( UseSSE==0 && Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
11338 match(Set dst (ConvI2F (LoadI mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11339 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
11340 format %{ "FILD $mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11341 "FSTP_S $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11342 opcode(0xDB); /* DB /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11343 ins_encode( OpcP, RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11344 Pop_Mem_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11345 ins_pipe( fpu_mem_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11346 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11347
a61af66fc99e Initial load
duke
parents:
diff changeset
11348 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11349 instruct convI2FPR_reg(regFPR dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11350 predicate( UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
11351 match(Set dst (ConvI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11352 format %{ "FILD $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11353 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11354 opcode(0xDB, 0x0); /* DB /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11355 ins_encode( Push_Mem_I(src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11356 Pop_Reg_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11357 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11358 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11359
a61af66fc99e Initial load
duke
parents:
diff changeset
11360 // This instruction does not round to 24-bits
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11361 instruct convI2FPR_mem(regFPR dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11362 predicate( UseSSE==0 && !Compile::current()->select_24_bit_instr());
a61af66fc99e Initial load
duke
parents:
diff changeset
11363 match(Set dst (ConvI2F (LoadI mem)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11364 format %{ "FILD $mem\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11365 "FSTP $dst" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11366 opcode(0xDB); /* DB /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11367 ins_encode( OpcP, RMopc_Mem(0x00,mem),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11368 Pop_Reg_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11369 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11370 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11371
a61af66fc99e Initial load
duke
parents:
diff changeset
11372 // Convert an int to a float in xmm; no rounding step needed.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11373 instruct convI2F_reg(regF dst, rRegI src) %{
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11374 predicate( UseSSE==1 || UseSSE>=2 && !UseXmmI2F );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11375 match(Set dst (ConvI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11376 format %{ "CVTSI2SS $dst, $src" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11377 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11378 __ cvtsi2ssl ($dst$$XMMRegister, $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11379 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11380 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11381 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11382
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11383 instruct convXI2F_reg(regF dst, rRegI src)
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11384 %{
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11385 predicate( UseSSE>=2 && UseXmmI2F );
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11386 match(Set dst (ConvI2F src));
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11387
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11388 format %{ "MOVD $dst,$src\n\t"
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11389 "CVTDQ2PS $dst,$dst\t# i2f" %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11390 ins_encode %{
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
11391 __ movdl($dst$$XMMRegister, $src$$Register);
71
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11392 __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister);
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11393 %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11394 ins_pipe(pipe_slow); // XXX
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11395 %}
3d62cb85208d 6662967: Optimize I2D conversion on new x86
kvn
parents: 0
diff changeset
11396
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11397 instruct convI2L_reg( eRegL dst, rRegI src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11398 match(Set dst (ConvI2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11399 effect(KILL cr);
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
11400 ins_cost(375);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11401 format %{ "MOV $dst.lo,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11402 "MOV $dst.hi,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11403 "SAR $dst.hi,31" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11404 ins_encode(convert_int_long(dst,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11405 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
11406 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11407
a61af66fc99e Initial load
duke
parents:
diff changeset
11408 // Zero-extend convert int to long
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11409 instruct convI2L_reg_zex(eRegL dst, rRegI src, immL_32bits mask, eFlagsReg flags ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11410 match(Set dst (AndL (ConvI2L src) mask) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11411 effect( KILL flags );
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
11412 ins_cost(250);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11413 format %{ "MOV $dst.lo,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11414 "XOR $dst.hi,$dst.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11415 opcode(0x33); // XOR
a61af66fc99e Initial load
duke
parents:
diff changeset
11416 ins_encode(enc_Copy(dst,src), OpcP, RegReg_Hi2(dst,dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11417 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
11418 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11419
a61af66fc99e Initial load
duke
parents:
diff changeset
11420 // Zero-extend long
a61af66fc99e Initial load
duke
parents:
diff changeset
11421 instruct zerox_long(eRegL dst, eRegL src, immL_32bits mask, eFlagsReg flags ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11422 match(Set dst (AndL src mask) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11423 effect( KILL flags );
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 622
diff changeset
11424 ins_cost(250);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11425 format %{ "MOV $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11426 "XOR $dst.hi,$dst.hi\n\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11427 opcode(0x33); // XOR
a61af66fc99e Initial load
duke
parents:
diff changeset
11428 ins_encode(enc_Copy(dst,src), OpcP, RegReg_Hi2(dst,dst) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11429 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
11430 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11431
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11432 instruct convL2DPR_reg( stackSlotD dst, eRegL src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11433 predicate (UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11434 match(Set dst (ConvL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11435 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11436 format %{ "PUSH $src.hi\t# Convert long to double\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11437 "PUSH $src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11438 "FILD ST,[ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11439 "ADD ESP,8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11440 "FSTP_D $dst\t# D-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11441 opcode(0xDF, 0x5); /* DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11442 ins_encode(convert_long_double(src), Pop_Mem_DPR(dst));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11443 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11444 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11445
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11446 instruct convL2D_reg( regD dst, eRegL src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11447 predicate (UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11448 match(Set dst (ConvL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11449 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11450 format %{ "PUSH $src.hi\t# Convert long to double\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11451 "PUSH $src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11452 "FILD_D [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11453 "FSTP_D [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11454 "MOVSD $dst,[ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11455 "ADD ESP,8" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11456 opcode(0xDF, 0x5); /* DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11457 ins_encode(convert_long_double2(src), Push_ResultD(dst));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11458 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11459 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11460
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11461 instruct convL2F_reg( regF dst, eRegL src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11462 predicate (UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11463 match(Set dst (ConvL2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11464 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11465 format %{ "PUSH $src.hi\t# Convert long to single float\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11466 "PUSH $src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11467 "FILD_D [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11468 "FSTP_S [ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11469 "MOVSS $dst,[ESP]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11470 "ADD ESP,8" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11471 opcode(0xDF, 0x5); /* DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11472 ins_encode(convert_long_double2(src), Push_ResultF(dst,0x8));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11473 ins_pipe( pipe_slow );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11474 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11475
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11476 instruct convL2FPR_reg( stackSlotF dst, eRegL src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11477 match(Set dst (ConvL2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11478 effect( KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
11479 format %{ "PUSH $src.hi\t# Convert long to single float\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11480 "PUSH $src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11481 "FILD ST,[ESP + #0]\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11482 "ADD ESP,8\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11483 "FSTP_S $dst\t# F-round" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11484 opcode(0xDF, 0x5); /* DF /5 */
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11485 ins_encode(convert_long_double(src), Pop_Mem_FPR(dst));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11486 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11487 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11488
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11489 instruct convL2I_reg( rRegI dst, eRegL src ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11490 match(Set dst (ConvL2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11491 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11492 format %{ "MOV $dst,$src.lo" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11493 ins_encode(enc_CopyL_Lo(dst,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11494 ins_pipe( ialu_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11495 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11496
a61af66fc99e Initial load
duke
parents:
diff changeset
11497
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11498 instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11499 match(Set dst (MoveF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11500 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11501 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
11502 format %{ "MOV $dst,$src\t# MoveF2I_stack_reg" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11503 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11504 __ movl($dst$$Register, Address(rsp, $src$$disp));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11505 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11506 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11507 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11508
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11509 instruct MoveFPR2I_reg_stack(stackSlotI dst, regFPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11510 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
11511 match(Set dst (MoveF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11512 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11513
a61af66fc99e Initial load
duke
parents:
diff changeset
11514 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
11515 format %{ "FST_S $dst,$src\t# MoveF2I_reg_stack" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11516 ins_encode( Pop_Mem_Reg_FPR(dst, src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11517 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11518 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11519
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11520 instruct MoveF2I_reg_stack_sse(stackSlotI dst, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11521 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11522 match(Set dst (MoveF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11523 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11524
a61af66fc99e Initial load
duke
parents:
diff changeset
11525 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
11526 format %{ "MOVSS $dst,$src\t# MoveF2I_reg_stack_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11527 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11528 __ movflt(Address(rsp, $dst$$disp), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11529 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11530 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11531 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11532
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11533 instruct MoveF2I_reg_reg_sse(rRegI dst, regF src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11534 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11535 match(Set dst (MoveF2I src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11536 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11537 ins_cost(85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11538 format %{ "MOVD $dst,$src\t# MoveF2I_reg_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11539 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11540 __ movdl($dst$$Register, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11541 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11542 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11543 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11544
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11545 instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11546 match(Set dst (MoveI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11547 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11548
a61af66fc99e Initial load
duke
parents:
diff changeset
11549 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
11550 format %{ "MOV $dst,$src\t# MoveI2F_reg_stack" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11551 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11552 __ movl(Address(rsp, $dst$$disp), $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11553 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11554 ins_pipe( ialu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11555 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11556
a61af66fc99e Initial load
duke
parents:
diff changeset
11557
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11558 instruct MoveI2FPR_stack_reg(regFPR dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11559 predicate(UseSSE==0);
a61af66fc99e Initial load
duke
parents:
diff changeset
11560 match(Set dst (MoveI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11561 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11562
a61af66fc99e Initial load
duke
parents:
diff changeset
11563 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
11564 format %{ "FLD_S $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11565 "FSTP $dst\t# MoveI2F_stack_reg" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11566 opcode(0xD9); /* D9 /0, FLD m32real */
a61af66fc99e Initial load
duke
parents:
diff changeset
11567 ins_encode( OpcP, RMopc_Mem_no_oop(0x00,src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11568 Pop_Reg_FPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11569 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11570 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11571
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11572 instruct MoveI2F_stack_reg_sse(regF dst, stackSlotI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11573 predicate(UseSSE>=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11574 match(Set dst (MoveI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11575 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11576
a61af66fc99e Initial load
duke
parents:
diff changeset
11577 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
11578 format %{ "MOVSS $dst,$src\t# MoveI2F_stack_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11579 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11580 __ movflt($dst$$XMMRegister, Address(rsp, $src$$disp));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11581 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11582 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11583 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11584
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11585 instruct MoveI2F_reg_reg_sse(regF dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11586 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11587 match(Set dst (MoveI2F src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11588 effect( DEF dst, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11589
a61af66fc99e Initial load
duke
parents:
diff changeset
11590 ins_cost(85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11591 format %{ "MOVD $dst,$src\t# MoveI2F_reg_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11592 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11593 __ movdl($dst$$XMMRegister, $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11594 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11595 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11596 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11597
a61af66fc99e Initial load
duke
parents:
diff changeset
11598 instruct MoveD2L_stack_reg(eRegL dst, stackSlotD src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11599 match(Set dst (MoveD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11600 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11601
a61af66fc99e Initial load
duke
parents:
diff changeset
11602 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
11603 format %{ "MOV $dst.lo,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11604 "MOV $dst.hi,$src+4\t# MoveD2L_stack_reg" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11605 opcode(0x8B, 0x8B);
a61af66fc99e Initial load
duke
parents:
diff changeset
11606 ins_encode( OpcP, RegMem(dst,src), OpcS, RegMem_Hi(dst,src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11607 ins_pipe( ialu_mem_long_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11608 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11609
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11610 instruct MoveDPR2L_reg_stack(stackSlotL dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11611 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11612 match(Set dst (MoveD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11613 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11614
a61af66fc99e Initial load
duke
parents:
diff changeset
11615 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
11616 format %{ "FST_D $dst,$src\t# MoveD2L_reg_stack" %}
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11617 ins_encode( Pop_Mem_Reg_DPR(dst, src) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11618 ins_pipe( fpu_mem_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11619 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11620
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11621 instruct MoveD2L_reg_stack_sse(stackSlotL dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11622 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11623 match(Set dst (MoveD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11624 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11625 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
11626 format %{ "MOVSD $dst,$src\t# MoveD2L_reg_stack_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11627 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11628 __ movdbl(Address(rsp, $dst$$disp), $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11629 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11630 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11631 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11632
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11633 instruct MoveD2L_reg_reg_sse(eRegL dst, regD src, regD tmp) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11634 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11635 match(Set dst (MoveD2L src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11636 effect(DEF dst, USE src, TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
11637 ins_cost(85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11638 format %{ "MOVD $dst.lo,$src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11639 "PSHUFLW $tmp,$src,0x4E\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11640 "MOVD $dst.hi,$tmp\t# MoveD2L_reg_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11641 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11642 __ movdl($dst$$Register, $src$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11643 __ pshuflw($tmp$$XMMRegister, $src$$XMMRegister, 0x4e);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11644 __ movdl(HIGH_FROM_LOW($dst$$Register), $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11645 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11646 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11647 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11648
a61af66fc99e Initial load
duke
parents:
diff changeset
11649 instruct MoveL2D_reg_stack(stackSlotD dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11650 match(Set dst (MoveL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11651 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11652
a61af66fc99e Initial load
duke
parents:
diff changeset
11653 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
11654 format %{ "MOV $dst,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11655 "MOV $dst+4,$src.hi\t# MoveL2D_reg_stack" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11656 opcode(0x89, 0x89);
a61af66fc99e Initial load
duke
parents:
diff changeset
11657 ins_encode( OpcP, RegMem( src, dst ), OpcS, RegMem_Hi( src, dst ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11658 ins_pipe( ialu_mem_long_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11659 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11660
a61af66fc99e Initial load
duke
parents:
diff changeset
11661
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11662 instruct MoveL2DPR_stack_reg(regDPR dst, stackSlotL src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11663 predicate(UseSSE<=1);
a61af66fc99e Initial load
duke
parents:
diff changeset
11664 match(Set dst (MoveL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11665 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11666 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
11667
a61af66fc99e Initial load
duke
parents:
diff changeset
11668 format %{ "FLD_D $src\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11669 "FSTP $dst\t# MoveL2D_stack_reg" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11670 opcode(0xDD); /* DD /0, FLD m64real */
a61af66fc99e Initial load
duke
parents:
diff changeset
11671 ins_encode( OpcP, RMopc_Mem_no_oop(0x00,src),
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11672 Pop_Reg_DPR(dst) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11673 ins_pipe( fpu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11674 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11675
a61af66fc99e Initial load
duke
parents:
diff changeset
11676
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11677 instruct MoveL2D_stack_reg_sse(regD dst, stackSlotL src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11678 predicate(UseSSE>=2 && UseXmmLoadAndClearUpper);
a61af66fc99e Initial load
duke
parents:
diff changeset
11679 match(Set dst (MoveL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11680 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11681
a61af66fc99e Initial load
duke
parents:
diff changeset
11682 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
11683 format %{ "MOVSD $dst,$src\t# MoveL2D_stack_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11684 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11685 __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11686 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11687 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11688 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11689
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11690 instruct MoveL2D_stack_reg_sse_partial(regD dst, stackSlotL src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11691 predicate(UseSSE>=2 && !UseXmmLoadAndClearUpper);
a61af66fc99e Initial load
duke
parents:
diff changeset
11692 match(Set dst (MoveL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11693 effect(DEF dst, USE src);
a61af66fc99e Initial load
duke
parents:
diff changeset
11694
a61af66fc99e Initial load
duke
parents:
diff changeset
11695 ins_cost(95);
a61af66fc99e Initial load
duke
parents:
diff changeset
11696 format %{ "MOVLPD $dst,$src\t# MoveL2D_stack_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11697 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11698 __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11699 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11700 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11701 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11702
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11703 instruct MoveL2D_reg_reg_sse(regD dst, eRegL src, regD tmp) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11704 predicate(UseSSE>=2);
a61af66fc99e Initial load
duke
parents:
diff changeset
11705 match(Set dst (MoveL2D src));
a61af66fc99e Initial load
duke
parents:
diff changeset
11706 effect(TEMP dst, USE src, TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
11707 ins_cost(85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11708 format %{ "MOVD $dst,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11709 "MOVD $tmp,$src.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
11710 "PUNPCKLDQ $dst,$tmp\t# MoveL2D_reg_reg_sse" %}
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11711 ins_encode %{
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11712 __ movdl($dst$$XMMRegister, $src$$Register);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11713 __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11714 __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 4121
diff changeset
11715 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11716 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11717 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11718
a61af66fc99e Initial load
duke
parents:
diff changeset
11719
a61af66fc99e Initial load
duke
parents:
diff changeset
11720 // =======================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
11721 // fast clearing of an array
a61af66fc99e Initial load
duke
parents:
diff changeset
11722 instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11723 predicate(!UseFastStosb);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11724 match(Set dummy (ClearArray cnt base));
a61af66fc99e Initial load
duke
parents:
diff changeset
11725 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11726 format %{ "XOR EAX,EAX\t# ClearArray:\n\t"
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11727 "SHL ECX,1\t# Convert doublewords to words\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11728 "REP STOS\t# store EAX into [EDI++] while ECX--" %}
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11729 ins_encode %{
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11730 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11731 %}
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11732 ins_pipe( pipe_slow );
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11733 %}
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11734
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11735 instruct rep_fast_stosb(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11736 predicate(UseFastStosb);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11737 match(Set dummy (ClearArray cnt base));
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11738 effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11739 format %{ "XOR EAX,EAX\t# ClearArray:\n\t"
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11740 "SHL ECX,3\t# Convert doublewords to bytes\n\t"
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11741 "REP STOSB\t# store EAX into [EDI++] while ECX--" %}
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11742 ins_encode %{
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11743 __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6853
diff changeset
11744 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11745 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11746 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11747
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2008
diff changeset
11748 instruct string_compare(eDIRegP str1, eCXRegI cnt1, eSIRegP str2, eDXRegI cnt2,
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11749 eAXRegI result, regD tmp1, eFlagsReg cr) %{
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11750 match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2008
diff changeset
11751 effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2008
diff changeset
11752
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2008
diff changeset
11753 format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %}
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11754 ins_encode %{
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11755 __ string_compare($str1$$Register, $str2$$Register,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11756 $cnt1$$Register, $cnt2$$Register, $result$$Register,
2262
6bbaedb03534 7016474: string compare intrinsic improvements
never
parents: 2008
diff changeset
11757 $tmp1$$XMMRegister);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11758 %}
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11759 ins_pipe( pipe_slow );
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11760 %}
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11761
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11762 // fast string equals
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11763 instruct string_equals(eDIRegP str1, eSIRegP str2, eCXRegI cnt, eAXRegI result,
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11764 regD tmp1, regD tmp2, eBXRegI tmp3, eFlagsReg cr) %{
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11765 match(Set result (StrEquals (Binary str1 str2) cnt));
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11766 effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11767
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11768 format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp1, $tmp2, $tmp3" %}
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11769 ins_encode %{
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11770 __ char_arrays_equals(false, $str1$$Register, $str2$$Register,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11771 $cnt$$Register, $result$$Register, $tmp3$$Register,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11772 $tmp1$$XMMRegister, $tmp2$$XMMRegister);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11773 %}
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11774 ins_pipe( pipe_slow );
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11775 %}
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11776
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11777 // fast search of substring with known size.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11778 instruct string_indexof_con(eDIRegP str1, eDXRegI cnt1, eSIRegP str2, immI int_cnt2,
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11779 eBXRegI result, regD vec, eAXRegI cnt2, eCXRegI tmp, eFlagsReg cr) %{
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11780 predicate(UseSSE42Intrinsics);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11781 match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11782 effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11783
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11784 format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $vec, $cnt1, $cnt2, $tmp" %}
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11785 ins_encode %{
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11786 int icnt2 = (int)$int_cnt2$$constant;
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11787 if (icnt2 >= 8) {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11788 // IndexOf for constant substrings with size >= 8 elements
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11789 // which don't need to be loaded through stack.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11790 __ string_indexofC8($str1$$Register, $str2$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11791 $cnt1$$Register, $cnt2$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11792 icnt2, $result$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11793 $vec$$XMMRegister, $tmp$$Register);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11794 } else {
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11795 // Small strings are loaded through stack if they cross page boundary.
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11796 __ string_indexof($str1$$Register, $str2$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11797 $cnt1$$Register, $cnt2$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11798 icnt2, $result$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11799 $vec$$XMMRegister, $tmp$$Register);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11800 }
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11801 %}
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11802 ins_pipe( pipe_slow );
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11803 %}
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11804
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11805 instruct string_indexof(eDIRegP str1, eDXRegI cnt1, eSIRegP str2, eAXRegI cnt2,
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11806 eBXRegI result, regD vec, eCXRegI tmp, eFlagsReg cr) %{
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11807 predicate(UseSSE42Intrinsics);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11808 match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11809 effect(TEMP vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr);
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11810
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11811 format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %}
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11812 ins_encode %{
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11813 __ string_indexof($str1$$Register, $str2$$Register,
2320
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11814 $cnt1$$Register, $cnt2$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11815 (-1), $result$$Register,
41d4973cf100 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 2262
diff changeset
11816 $vec$$XMMRegister, $tmp$$Register);
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11817 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11818 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
11819 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11820
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11821 // fast array equals
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11822 instruct array_equals(eDIRegP ary1, eSIRegP ary2, eAXRegI result,
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
11823 regD tmp1, regD tmp2, eCXRegI tmp3, eBXRegI tmp4, eFlagsReg cr)
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11824 %{
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11825 match(Set result (AryEq ary1 ary2));
681
fbde8ec322d0 6761600: Use sse 4.2 in intrinsics
cfang
parents: 671
diff changeset
11826 effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr);
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11827 //ins_cost(300);
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11828
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11829 format %{ "Array Equals $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %}
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11830 ins_encode %{
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11831 __ char_arrays_equals(true, $ary1$$Register, $ary2$$Register,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11832 $tmp3$$Register, $result$$Register, $tmp4$$Register,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11833 $tmp1$$XMMRegister, $tmp2$$XMMRegister);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 824
diff changeset
11834 %}
169
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11835 ins_pipe( pipe_slow );
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11836 %}
9148c65abefc 6695049: (coll) Create an x86 intrinsic for Arrays.equals
rasbold
parents: 113
diff changeset
11837
7637
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11838 // encode char[] to byte[] in ISO_8859_1
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11839 instruct encode_iso_array(eSIRegP src, eDIRegP dst, eDXRegI len,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11840 regD tmp1, regD tmp2, regD tmp3, regD tmp4,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11841 eCXRegI tmp5, eAXRegI result, eFlagsReg cr) %{
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11842 match(Set result (EncodeISOArray src (Binary dst len)));
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11843 effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11844
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11845 format %{ "Encode array $src,$dst,$len -> $result // KILL ECX, EDX, $tmp1, $tmp2, $tmp3, $tmp4, ESI, EDI " %}
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11846 ins_encode %{
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11847 __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11848 $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister,
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11849 $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register);
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11850 %}
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11851 ins_pipe( pipe_slow );
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11852 %}
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11853
b30b3c2a0cf2 6896617: Optimize sun.nio.cs.ISO_8859_1$Encode.encodeArrayLoop() on x86
kvn
parents: 7474
diff changeset
11854
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11855 //----------Control Flow Instructions------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
11856 // Signed compare Instructions
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11857 instruct compI_eReg(eFlagsReg cr, rRegI op1, rRegI op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11858 match(Set cr (CmpI op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11859 effect( DEF cr, USE op1, USE op2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
11860 format %{ "CMP $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11861 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11862 ins_encode( OpcP, RegReg( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11863 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11864 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11865
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11866 instruct compI_eReg_imm(eFlagsReg cr, rRegI op1, immI op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11867 match(Set cr (CmpI op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11868 effect( DEF cr, USE op1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
11869 format %{ "CMP $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11870 opcode(0x81,0x07); /* Opcode 81 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11871 // ins_encode( RegImm( op1, op2) ); /* Was CmpImm */
a61af66fc99e Initial load
duke
parents:
diff changeset
11872 ins_encode( OpcSErm( op1, op2 ), Con8or32( op2 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11873 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11874 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11875
a61af66fc99e Initial load
duke
parents:
diff changeset
11876 // Cisc-spilled version of cmpI_eReg
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11877 instruct compI_eReg_mem(eFlagsReg cr, rRegI op1, memory op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11878 match(Set cr (CmpI op1 (LoadI op2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11879
a61af66fc99e Initial load
duke
parents:
diff changeset
11880 format %{ "CMP $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11881 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
11882 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11883 ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11884 ins_pipe( ialu_cr_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11885 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11886
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11887 instruct testI_reg( eFlagsReg cr, rRegI src, immI0 zero ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11888 match(Set cr (CmpI src zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
11889 effect( DEF cr, USE src );
a61af66fc99e Initial load
duke
parents:
diff changeset
11890
a61af66fc99e Initial load
duke
parents:
diff changeset
11891 format %{ "TEST $src,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11892 opcode(0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11893 ins_encode( OpcP, RegReg( src, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11894 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11895 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11896
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11897 instruct testI_reg_imm( eFlagsReg cr, rRegI src, immI con, immI0 zero ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11898 match(Set cr (CmpI (AndI src con) zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
11899
a61af66fc99e Initial load
duke
parents:
diff changeset
11900 format %{ "TEST $src,$con" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11901 opcode(0xF7,0x00);
a61af66fc99e Initial load
duke
parents:
diff changeset
11902 ins_encode( OpcP, RegOpc(src), Con32(con) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11903 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11904 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11905
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11906 instruct testI_reg_mem( eFlagsReg cr, rRegI src, memory mem, immI0 zero ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11907 match(Set cr (CmpI (AndI src mem) zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
11908
a61af66fc99e Initial load
duke
parents:
diff changeset
11909 format %{ "TEST $src,$mem" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11910 opcode(0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11911 ins_encode( OpcP, RegMem( src, mem ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11912 ins_pipe( ialu_cr_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11913 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11914
a61af66fc99e Initial load
duke
parents:
diff changeset
11915 // Unsigned compare Instructions; really, same as signed except they
a61af66fc99e Initial load
duke
parents:
diff changeset
11916 // produce an eFlagsRegU instead of eFlagsReg.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11917 instruct compU_eReg(eFlagsRegU cr, rRegI op1, rRegI op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11918 match(Set cr (CmpU op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11919
a61af66fc99e Initial load
duke
parents:
diff changeset
11920 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11921 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11922 ins_encode( OpcP, RegReg( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11923 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11924 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11925
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11926 instruct compU_eReg_imm(eFlagsRegU cr, rRegI op1, immI op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11927 match(Set cr (CmpU op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11928
a61af66fc99e Initial load
duke
parents:
diff changeset
11929 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11930 opcode(0x81,0x07); /* Opcode 81 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11931 ins_encode( OpcSErm( op1, op2 ), Con8or32( op2 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11932 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11933 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11934
a61af66fc99e Initial load
duke
parents:
diff changeset
11935 // // Cisc-spilled version of cmpU_eReg
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11936 instruct compU_eReg_mem(eFlagsRegU cr, rRegI op1, memory op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11937 match(Set cr (CmpU op1 (LoadI op2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11938
a61af66fc99e Initial load
duke
parents:
diff changeset
11939 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11940 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
11941 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11942 ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11943 ins_pipe( ialu_cr_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11944 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11945
a61af66fc99e Initial load
duke
parents:
diff changeset
11946 // // Cisc-spilled version of cmpU_eReg
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11947 //instruct compU_mem_eReg(eFlagsRegU cr, memory op1, rRegI op2) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11948 // match(Set cr (CmpU (LoadI op1) op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11949 //
a61af66fc99e Initial load
duke
parents:
diff changeset
11950 // format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11951 // ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
11952 // opcode(0x39); /* Opcode 39 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11953 // ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11954 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
11955
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
11956 instruct testU_reg( eFlagsRegU cr, rRegI src, immI0 zero ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
11957 match(Set cr (CmpU src zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
11958
a61af66fc99e Initial load
duke
parents:
diff changeset
11959 format %{ "TESTu $src,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11960 opcode(0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
11961 ins_encode( OpcP, RegReg( src, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11962 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11963 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11964
a61af66fc99e Initial load
duke
parents:
diff changeset
11965 // Unsigned pointer compare Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
11966 instruct compP_eReg(eFlagsRegU cr, eRegP op1, eRegP op2) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11967 match(Set cr (CmpP op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11968
a61af66fc99e Initial load
duke
parents:
diff changeset
11969 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11970 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11971 ins_encode( OpcP, RegReg( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11972 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
11973 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11974
a61af66fc99e Initial load
duke
parents:
diff changeset
11975 instruct compP_eReg_imm(eFlagsRegU cr, eRegP op1, immP op2) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11976 match(Set cr (CmpP op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11977
a61af66fc99e Initial load
duke
parents:
diff changeset
11978 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11979 opcode(0x81,0x07); /* Opcode 81 /7 */
a61af66fc99e Initial load
duke
parents:
diff changeset
11980 ins_encode( OpcSErm( op1, op2 ), Con8or32( op2 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11981 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
11982 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11983
a61af66fc99e Initial load
duke
parents:
diff changeset
11984 // // Cisc-spilled version of cmpP_eReg
a61af66fc99e Initial load
duke
parents:
diff changeset
11985 instruct compP_eReg_mem(eFlagsRegU cr, eRegP op1, memory op2) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11986 match(Set cr (CmpP op1 (LoadP op2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
11987
a61af66fc99e Initial load
duke
parents:
diff changeset
11988 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11989 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
11990 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
11991 ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
11992 ins_pipe( ialu_cr_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
11993 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
11994
a61af66fc99e Initial load
duke
parents:
diff changeset
11995 // // Cisc-spilled version of cmpP_eReg
a61af66fc99e Initial load
duke
parents:
diff changeset
11996 //instruct compP_mem_eReg(eFlagsRegU cr, memory op1, eRegP op2) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
11997 // match(Set cr (CmpP (LoadP op1) op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
11998 //
a61af66fc99e Initial load
duke
parents:
diff changeset
11999 // format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12000 // ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
12001 // opcode(0x39); /* Opcode 39 /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
12002 // ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12003 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
12004
a61af66fc99e Initial load
duke
parents:
diff changeset
12005 // Compare raw pointer (used in out-of-heap check).
a61af66fc99e Initial load
duke
parents:
diff changeset
12006 // Only works because non-oop pointers must be raw pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
12007 // and raw pointers have no anti-dependencies.
a61af66fc99e Initial load
duke
parents:
diff changeset
12008 instruct compP_mem_eReg( eFlagsRegU cr, eRegP op1, memory op2 ) %{
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6614
diff changeset
12009 predicate( n->in(2)->in(2)->bottom_type()->reloc() == relocInfo::none );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12010 match(Set cr (CmpP op1 (LoadP op2)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12011
a61af66fc99e Initial load
duke
parents:
diff changeset
12012 format %{ "CMPu $op1,$op2" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12013 opcode(0x3B); /* Opcode 3B /r */
a61af66fc99e Initial load
duke
parents:
diff changeset
12014 ins_encode( OpcP, RegMem( op1, op2) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12015 ins_pipe( ialu_cr_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
12016 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12017
a61af66fc99e Initial load
duke
parents:
diff changeset
12018 //
a61af66fc99e Initial load
duke
parents:
diff changeset
12019 // This will generate a signed flags result. This should be ok
a61af66fc99e Initial load
duke
parents:
diff changeset
12020 // since any compare to a zero should be eq/neq.
a61af66fc99e Initial load
duke
parents:
diff changeset
12021 instruct testP_reg( eFlagsReg cr, eRegP src, immP0 zero ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12022 match(Set cr (CmpP src zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
12023
a61af66fc99e Initial load
duke
parents:
diff changeset
12024 format %{ "TEST $src,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12025 opcode(0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
12026 ins_encode( OpcP, RegReg( src, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12027 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
12028 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12029
a61af66fc99e Initial load
duke
parents:
diff changeset
12030 // Cisc-spilled version of testP_reg
a61af66fc99e Initial load
duke
parents:
diff changeset
12031 // This will generate a signed flags result. This should be ok
a61af66fc99e Initial load
duke
parents:
diff changeset
12032 // since any compare to a zero should be eq/neq.
a61af66fc99e Initial load
duke
parents:
diff changeset
12033 instruct testP_Reg_mem( eFlagsReg cr, memory op, immI0 zero ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12034 match(Set cr (CmpP (LoadP op) zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
12035
a61af66fc99e Initial load
duke
parents:
diff changeset
12036 format %{ "TEST $op,0xFFFFFFFF" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12037 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
12038 opcode(0xF7); /* Opcode F7 /0 */
a61af66fc99e Initial load
duke
parents:
diff changeset
12039 ins_encode( OpcP, RMopc_Mem(0x00,op), Con_d32(0xFFFFFFFF) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12040 ins_pipe( ialu_cr_reg_imm );
a61af66fc99e Initial load
duke
parents:
diff changeset
12041 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12042
a61af66fc99e Initial load
duke
parents:
diff changeset
12043 // Yanked all unsigned pointer compare operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
12044 // Pointer compares are done with CmpP which is already unsigned.
a61af66fc99e Initial load
duke
parents:
diff changeset
12045
a61af66fc99e Initial load
duke
parents:
diff changeset
12046 //----------Max and Min--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
12047 // Min Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
12048 ////
a61af66fc99e Initial load
duke
parents:
diff changeset
12049 // *** Min and Max using the conditional move are slower than the
a61af66fc99e Initial load
duke
parents:
diff changeset
12050 // *** branch version on a Pentium III.
a61af66fc99e Initial load
duke
parents:
diff changeset
12051 // // Conditional move for min
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12052 //instruct cmovI_reg_lt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12053 // effect( USE_DEF op2, USE op1, USE cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
12054 // format %{ "CMOVlt $op2,$op1\t! min" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12055 // opcode(0x4C,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
12056 // ins_encode( OpcS, OpcP, RegReg( op2, op1 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12057 // ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12058 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
12059 //
a61af66fc99e Initial load
duke
parents:
diff changeset
12060 //// Min Register with Register (P6 version)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12061 //instruct minI_eReg_p6( rRegI op1, rRegI op2 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12062 // predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
12063 // match(Set op2 (MinI op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
12064 // ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12065 // expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12066 // eFlagsReg cr;
a61af66fc99e Initial load
duke
parents:
diff changeset
12067 // compI_eReg(cr,op1,op2);
a61af66fc99e Initial load
duke
parents:
diff changeset
12068 // cmovI_reg_lt(op2,op1,cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12069 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12070 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
12071
a61af66fc99e Initial load
duke
parents:
diff changeset
12072 // Min Register with Register (generic version)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12073 instruct minI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12074 match(Set dst (MinI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
12075 effect(KILL flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
12076 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12077
a61af66fc99e Initial load
duke
parents:
diff changeset
12078 format %{ "MIN $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12079 opcode(0xCC);
a61af66fc99e Initial load
duke
parents:
diff changeset
12080 ins_encode( min_enc(dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12081 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12082 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12083
a61af66fc99e Initial load
duke
parents:
diff changeset
12084 // Max Register with Register
a61af66fc99e Initial load
duke
parents:
diff changeset
12085 // *** Min and Max using the conditional move are slower than the
a61af66fc99e Initial load
duke
parents:
diff changeset
12086 // *** branch version on a Pentium III.
a61af66fc99e Initial load
duke
parents:
diff changeset
12087 // // Conditional move for max
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12088 //instruct cmovI_reg_gt( rRegI op2, rRegI op1, eFlagsReg cr ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12089 // effect( USE_DEF op2, USE op1, USE cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
12090 // format %{ "CMOVgt $op2,$op1\t! max" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12091 // opcode(0x4F,0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
12092 // ins_encode( OpcS, OpcP, RegReg( op2, op1 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12093 // ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12094 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
12095 //
a61af66fc99e Initial load
duke
parents:
diff changeset
12096 // // Max Register with Register (P6 version)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12097 //instruct maxI_eReg_p6( rRegI op1, rRegI op2 ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12098 // predicate(VM_Version::supports_cmov() );
a61af66fc99e Initial load
duke
parents:
diff changeset
12099 // match(Set op2 (MaxI op1 op2));
a61af66fc99e Initial load
duke
parents:
diff changeset
12100 // ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12101 // expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12102 // eFlagsReg cr;
a61af66fc99e Initial load
duke
parents:
diff changeset
12103 // compI_eReg(cr,op1,op2);
a61af66fc99e Initial load
duke
parents:
diff changeset
12104 // cmovI_reg_gt(op2,op1,cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12105 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12106 //%}
a61af66fc99e Initial load
duke
parents:
diff changeset
12107
a61af66fc99e Initial load
duke
parents:
diff changeset
12108 // Max Register with Register (generic version)
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12109 instruct maxI_eReg(rRegI dst, rRegI src, eFlagsReg flags) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12110 match(Set dst (MaxI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
12111 effect(KILL flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
12112 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12113
a61af66fc99e Initial load
duke
parents:
diff changeset
12114 format %{ "MAX $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12115 opcode(0xCC);
a61af66fc99e Initial load
duke
parents:
diff changeset
12116 ins_encode( max_enc(dst,src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12117 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12118 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12119
a61af66fc99e Initial load
duke
parents:
diff changeset
12120 // ============================================================================
3345
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12121 // Counted Loop limit node which represents exact final iterator value.
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12122 // Note: the resulting value should fit into integer range since
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12123 // counted loops have limit check on overflow.
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12124 instruct loopLimit_eReg(eAXRegI limit, nadxRegI init, immI stride, eDXRegI limit_hi, nadxRegI tmp, eFlagsReg flags) %{
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12125 match(Set limit (LoopLimit (Binary init limit) stride));
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12126 effect(TEMP limit_hi, TEMP tmp, KILL flags);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12127 ins_cost(300);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12128
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12129 format %{ "loopLimit $init,$limit,$stride # $limit = $init + $stride *( $limit - $init + $stride -1)/ $stride, kills $limit_hi" %}
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12130 ins_encode %{
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12131 int strd = (int)$stride$$constant;
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12132 assert(strd != 1 && strd != -1, "sanity");
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12133 int m1 = (strd > 0) ? 1 : -1;
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12134 // Convert limit to long (EAX:EDX)
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12135 __ cdql();
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12136 // Convert init to long (init:tmp)
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12137 __ movl($tmp$$Register, $init$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12138 __ sarl($tmp$$Register, 31);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12139 // $limit - $init
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12140 __ subl($limit$$Register, $init$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12141 __ sbbl($limit_hi$$Register, $tmp$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12142 // + ($stride - 1)
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12143 if (strd > 0) {
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12144 __ addl($limit$$Register, (strd - 1));
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12145 __ adcl($limit_hi$$Register, 0);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12146 __ movl($tmp$$Register, strd);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12147 } else {
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12148 __ addl($limit$$Register, (strd + 1));
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12149 __ adcl($limit_hi$$Register, -1);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12150 __ lneg($limit_hi$$Register, $limit$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12151 __ movl($tmp$$Register, -strd);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12152 }
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12153 // signed devision: (EAX:EDX) / pos_stride
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12154 __ idivl($tmp$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12155 if (strd < 0) {
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12156 // restore sign
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12157 __ negl($tmp$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12158 }
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12159 // (EAX) * stride
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12160 __ mull($tmp$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12161 // + init (ignore upper bits)
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12162 __ addl($limit$$Register, $init$$Register);
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12163 %}
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12164 ins_pipe( pipe_slow );
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12165 %}
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12166
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2479
diff changeset
12167 // ============================================================================
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12168 // Branch Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
12169 // Jump Table
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12170 instruct jumpXtnd(rRegI switch_val) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12171 match(Jump switch_val);
a61af66fc99e Initial load
duke
parents:
diff changeset
12172 ins_cost(350);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
12173 format %{ "JMP [$constantaddress](,$switch_val,1)\n\t" %}
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
12174 ins_encode %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12175 // Jump to Address(table_base + switch_reg)
a61af66fc99e Initial load
duke
parents:
diff changeset
12176 Address index(noreg, $switch_val$$Register, Address::times_1);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 1920
diff changeset
12177 __ jump(ArrayAddress($constantaddress, index));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12178 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12179 ins_pipe(pipe_jmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12180 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12181
a61af66fc99e Initial load
duke
parents:
diff changeset
12182 // Jump Direct - Label defines a relative address from JMP+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12183 instruct jmpDir(label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12184 match(Goto);
a61af66fc99e Initial load
duke
parents:
diff changeset
12185 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12186
a61af66fc99e Initial load
duke
parents:
diff changeset
12187 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12188 format %{ "JMP $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12189 size(5);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12190 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12191 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12192 __ jmp(*L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12193 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12194 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
12195 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12196
a61af66fc99e Initial load
duke
parents:
diff changeset
12197 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12198 instruct jmpCon(cmpOp cop, eFlagsReg cr, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12199 match(If cop cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12200 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12201
a61af66fc99e Initial load
duke
parents:
diff changeset
12202 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12203 format %{ "J$cop $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12204 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12205 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12206 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12207 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12208 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12209 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12210 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12211
a61af66fc99e Initial load
duke
parents:
diff changeset
12212 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12213 instruct jmpLoopEnd(cmpOp cop, eFlagsReg cr, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12214 match(CountedLoopEnd cop cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12215 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12216
a61af66fc99e Initial load
duke
parents:
diff changeset
12217 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12218 format %{ "J$cop $labl\t# Loop end" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12219 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12220 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12221 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12222 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12223 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12224 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12225 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12226
a61af66fc99e Initial load
duke
parents:
diff changeset
12227 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12228 instruct jmpLoopEndU(cmpOpU cop, eFlagsRegU cmp, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12229 match(CountedLoopEnd cop cmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12230 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12231
a61af66fc99e Initial load
duke
parents:
diff changeset
12232 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12233 format %{ "J$cop,u $labl\t# Loop end" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12234 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12235 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12236 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12237 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12238 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12239 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12240 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12241
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12242 instruct jmpLoopEndUCF(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12243 match(CountedLoopEnd cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12244 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12245
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12246 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12247 format %{ "J$cop,u $labl\t# Loop end" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12248 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12249 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12250 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12251 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12252 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12253 ins_pipe( pipe_jcc );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12254 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12255
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12256 // Jump Direct Conditional - using unsigned comparison
a61af66fc99e Initial load
duke
parents:
diff changeset
12257 instruct jmpConU(cmpOpU cop, eFlagsRegU cmp, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12258 match(If cop cmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12259 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12260
a61af66fc99e Initial load
duke
parents:
diff changeset
12261 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12262 format %{ "J$cop,u $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12263 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12264 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12265 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12266 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12267 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12268 ins_pipe(pipe_jcc);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12269 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12270
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12271 instruct jmpConUCF(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12272 match(If cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12273 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12274
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12275 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12276 format %{ "J$cop,u $labl" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12277 size(6);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12278 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12279 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12280 __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12281 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12282 ins_pipe(pipe_jcc);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12283 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12284
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12285 instruct jmpConUCF2(cmpOpUCF2 cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12286 match(If cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12287 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12288
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12289 ins_cost(200);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12290 format %{ $$template
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12291 if ($cop$$cmpcode == Assembler::notEqual) {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12292 $$emit$$"JP,u $labl\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12293 $$emit$$"J$cop,u $labl"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12294 } else {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12295 $$emit$$"JP,u done\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12296 $$emit$$"J$cop,u $labl\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12297 $$emit$$"done:"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12298 }
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12299 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12300 ins_encode %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12301 Label* l = $labl$$label;
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12302 if ($cop$$cmpcode == Assembler::notEqual) {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12303 __ jcc(Assembler::parity, *l, false);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12304 __ jcc(Assembler::notEqual, *l, false);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12305 } else if ($cop$$cmpcode == Assembler::equal) {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12306 Label done;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12307 __ jccb(Assembler::parity, done);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12308 __ jcc(Assembler::equal, *l, false);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12309 __ bind(done);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12310 } else {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12311 ShouldNotReachHere();
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12312 }
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12313 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12314 ins_pipe(pipe_jcc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12315 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12316
a61af66fc99e Initial load
duke
parents:
diff changeset
12317 // ============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
12318 // The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass
a61af66fc99e Initial load
duke
parents:
diff changeset
12319 // array for an instance of the superklass. Set a hidden internal cache on a
a61af66fc99e Initial load
duke
parents:
diff changeset
12320 // hit (cache is checked with exposed code in gen_subtype_check()). Return
a61af66fc99e Initial load
duke
parents:
diff changeset
12321 // NZ for a miss or zero for a hit. The encoding ALSO sets flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
12322 instruct partialSubtypeCheck( eDIRegP result, eSIRegP sub, eAXRegP super, eCXRegI rcx, eFlagsReg cr ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12323 match(Set result (PartialSubtypeCheck sub super));
a61af66fc99e Initial load
duke
parents:
diff changeset
12324 effect( KILL rcx, KILL cr );
a61af66fc99e Initial load
duke
parents:
diff changeset
12325
a61af66fc99e Initial load
duke
parents:
diff changeset
12326 ins_cost(1100); // slightly larger than the next version
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
12327 format %{ "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6795
diff changeset
12328 "MOV ECX,[EDI+ArrayKlass::length]\t# length to scan\n\t"
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6795
diff changeset
12329 "ADD EDI,ArrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12330 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12331 "JNE,s miss\t\t# Missed: EDI not-zero\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12332 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12333 "XOR $result,$result\t\t Hit: EDI zero\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12334 "miss:\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12335
a61af66fc99e Initial load
duke
parents:
diff changeset
12336 opcode(0x1); // Force a XOR of EDI
a61af66fc99e Initial load
duke
parents:
diff changeset
12337 ins_encode( enc_PartialSubtypeCheck() );
a61af66fc99e Initial load
duke
parents:
diff changeset
12338 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12339 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12340
a61af66fc99e Initial load
duke
parents:
diff changeset
12341 instruct partialSubtypeCheck_vs_Zero( eFlagsReg cr, eSIRegP sub, eAXRegP super, eCXRegI rcx, eDIRegP result, immP0 zero ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12342 match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
a61af66fc99e Initial load
duke
parents:
diff changeset
12343 effect( KILL rcx, KILL result );
a61af66fc99e Initial load
duke
parents:
diff changeset
12344
a61af66fc99e Initial load
duke
parents:
diff changeset
12345 ins_cost(1000);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 643
diff changeset
12346 format %{ "MOV EDI,[$sub+Klass::secondary_supers]\n\t"
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6795
diff changeset
12347 "MOV ECX,[EDI+ArrayKlass::length]\t# length to scan\n\t"
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6795
diff changeset
12348 "ADD EDI,ArrayKlass::base_offset\t# Skip to start of data; set NZ in case count is zero\n\t"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12349 "REPNE SCASD\t# Scan *EDI++ for a match with EAX while CX-- != 0\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12350 "JNE,s miss\t\t# Missed: flags NZ\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12351 "MOV [$sub+Klass::secondary_super_cache],$super\t# Hit: update cache, flags Z\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12352 "miss:\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12353
a61af66fc99e Initial load
duke
parents:
diff changeset
12354 opcode(0x0); // No need to XOR EDI
a61af66fc99e Initial load
duke
parents:
diff changeset
12355 ins_encode( enc_PartialSubtypeCheck() );
a61af66fc99e Initial load
duke
parents:
diff changeset
12356 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12357 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12358
a61af66fc99e Initial load
duke
parents:
diff changeset
12359 // ============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
12360 // Branch Instructions -- short offset versions
a61af66fc99e Initial load
duke
parents:
diff changeset
12361 //
a61af66fc99e Initial load
duke
parents:
diff changeset
12362 // These instructions are used to replace jumps of a long offset (the default
a61af66fc99e Initial load
duke
parents:
diff changeset
12363 // match) with jumps of a shorter offset. These instructions are all tagged
a61af66fc99e Initial load
duke
parents:
diff changeset
12364 // with the ins_short_branch attribute, which causes the ADLC to suppress the
a61af66fc99e Initial load
duke
parents:
diff changeset
12365 // match rules in general matching. Instead, the ADLC generates a conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
12366 // method in the MachNode which can be used to do in-place replacement of the
a61af66fc99e Initial load
duke
parents:
diff changeset
12367 // long variant with the shorter variant. The compiler will determine if a
a61af66fc99e Initial load
duke
parents:
diff changeset
12368 // branch can be taken by the is_short_branch_offset() predicate in the machine
a61af66fc99e Initial load
duke
parents:
diff changeset
12369 // specific code section of the file.
a61af66fc99e Initial load
duke
parents:
diff changeset
12370
a61af66fc99e Initial load
duke
parents:
diff changeset
12371 // Jump Direct - Label defines a relative address from JMP+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12372 instruct jmpDir_short(label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12373 match(Goto);
a61af66fc99e Initial load
duke
parents:
diff changeset
12374 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12375
a61af66fc99e Initial load
duke
parents:
diff changeset
12376 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12377 format %{ "JMP,s $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12378 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12379 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12380 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12381 __ jmpb(*L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12382 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12383 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
12384 ins_short_branch(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
12385 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12386
a61af66fc99e Initial load
duke
parents:
diff changeset
12387 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12388 instruct jmpCon_short(cmpOp cop, eFlagsReg cr, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12389 match(If cop cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12390 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12391
a61af66fc99e Initial load
duke
parents:
diff changeset
12392 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12393 format %{ "J$cop,s $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12394 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12395 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12396 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12397 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12398 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12399 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12400 ins_short_branch(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
12401 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12402
a61af66fc99e Initial load
duke
parents:
diff changeset
12403 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12404 instruct jmpLoopEnd_short(cmpOp cop, eFlagsReg cr, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12405 match(CountedLoopEnd cop cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
12406 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12407
a61af66fc99e Initial load
duke
parents:
diff changeset
12408 ins_cost(300);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12409 format %{ "J$cop,s $labl\t# Loop end" %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12410 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12411 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12412 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12413 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12414 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12415 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12416 ins_short_branch(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
12417 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12418
a61af66fc99e Initial load
duke
parents:
diff changeset
12419 // Jump Direct Conditional - Label defines a relative address from Jcc+1
a61af66fc99e Initial load
duke
parents:
diff changeset
12420 instruct jmpLoopEndU_short(cmpOpU cop, eFlagsRegU cmp, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12421 match(CountedLoopEnd cop cmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12422 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12423
a61af66fc99e Initial load
duke
parents:
diff changeset
12424 ins_cost(300);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12425 format %{ "J$cop,us $labl\t# Loop end" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12426 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12427 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12428 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12429 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12430 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12431 ins_pipe( pipe_jcc );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12432 ins_short_branch(1);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12433 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12434
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12435 instruct jmpLoopEndUCF_short(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12436 match(CountedLoopEnd cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12437 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12438
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12439 ins_cost(300);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12440 format %{ "J$cop,us $labl\t# Loop end" %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12441 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12442 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12443 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12444 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12445 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12446 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12447 ins_short_branch(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
12448 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12449
a61af66fc99e Initial load
duke
parents:
diff changeset
12450 // Jump Direct Conditional - using unsigned comparison
a61af66fc99e Initial load
duke
parents:
diff changeset
12451 instruct jmpConU_short(cmpOpU cop, eFlagsRegU cmp, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12452 match(If cop cmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12453 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12454
a61af66fc99e Initial load
duke
parents:
diff changeset
12455 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12456 format %{ "J$cop,us $labl" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12457 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12458 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12459 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12460 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12461 %}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12462 ins_pipe( pipe_jcc );
a61af66fc99e Initial load
duke
parents:
diff changeset
12463 ins_short_branch(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
12464 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12465
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12466 instruct jmpConUCF_short(cmpOpUCF cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12467 match(If cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12468 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12469
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12470 ins_cost(300);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12471 format %{ "J$cop,us $labl" %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12472 size(2);
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12473 ins_encode %{
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12474 Label* L = $labl$$label;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12475 __ jccb((Assembler::Condition)($cop$$cmpcode), *L);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12476 %}
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12477 ins_pipe( pipe_jcc );
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12478 ins_short_branch(1);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12479 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12480
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12481 instruct jmpConUCF2_short(cmpOpUCF2 cop, eFlagsRegUCF cmp, label labl) %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12482 match(If cop cmp);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12483 effect(USE labl);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12484
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12485 ins_cost(300);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12486 format %{ $$template
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12487 if ($cop$$cmpcode == Assembler::notEqual) {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12488 $$emit$$"JP,u,s $labl\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12489 $$emit$$"J$cop,u,s $labl"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12490 } else {
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12491 $$emit$$"JP,u,s done\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12492 $$emit$$"J$cop,u,s $labl\n\t"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12493 $$emit$$"done:"
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12494 }
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12495 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12496 size(4);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12497 ins_encode %{
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12498 Label* l = $labl$$label;
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12499 if ($cop$$cmpcode == Assembler::notEqual) {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12500 __ jccb(Assembler::parity, *l);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12501 __ jccb(Assembler::notEqual, *l);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12502 } else if ($cop$$cmpcode == Assembler::equal) {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12503 Label done;
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12504 __ jccb(Assembler::parity, done);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12505 __ jccb(Assembler::equal, *l);
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12506 __ bind(done);
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12507 } else {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12508 ShouldNotReachHere();
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 3849
diff changeset
12509 }
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12510 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12511 ins_pipe(pipe_jcc);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12512 ins_short_branch(1);
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12513 %}
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 403
diff changeset
12514
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12515 // ============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
12516 // Long Compare
a61af66fc99e Initial load
duke
parents:
diff changeset
12517 //
a61af66fc99e Initial load
duke
parents:
diff changeset
12518 // Currently we hold longs in 2 registers. Comparing such values efficiently
a61af66fc99e Initial load
duke
parents:
diff changeset
12519 // is tricky. The flavor of compare used depends on whether we are testing
a61af66fc99e Initial load
duke
parents:
diff changeset
12520 // for LT, LE, or EQ. For a simple LT test we can check just the sign bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
12521 // The GE test is the negated LT test. The LE test can be had by commuting
a61af66fc99e Initial load
duke
parents:
diff changeset
12522 // the operands (yielding a GE test) and then negating; negate again for the
a61af66fc99e Initial load
duke
parents:
diff changeset
12523 // GT test. The EQ test is done by ORcc'ing the high and low halves, and the
a61af66fc99e Initial load
duke
parents:
diff changeset
12524 // NE test is negated from that.
a61af66fc99e Initial load
duke
parents:
diff changeset
12525
a61af66fc99e Initial load
duke
parents:
diff changeset
12526 // Due to a shortcoming in the ADLC, it mixes up expressions like:
a61af66fc99e Initial load
duke
parents:
diff changeset
12527 // (foo (CmpI (CmpL X Y) 0)) and (bar (CmpI (CmpL X 0L) 0)). Note the
a61af66fc99e Initial load
duke
parents:
diff changeset
12528 // difference between 'Y' and '0L'. The tree-matches for the CmpI sections
a61af66fc99e Initial load
duke
parents:
diff changeset
12529 // are collapsed internally in the ADLC's dfa-gen code. The match for
a61af66fc99e Initial load
duke
parents:
diff changeset
12530 // (CmpI (CmpL X Y) 0) is silently replaced with (CmpI (CmpL X 0L) 0) and the
a61af66fc99e Initial load
duke
parents:
diff changeset
12531 // foo match ends up with the wrong leaf. One fix is to not match both
a61af66fc99e Initial load
duke
parents:
diff changeset
12532 // reg-reg and reg-zero forms of long-compare. This is unfortunate because
a61af66fc99e Initial load
duke
parents:
diff changeset
12533 // both forms beat the trinary form of long-compare and both are very useful
a61af66fc99e Initial load
duke
parents:
diff changeset
12534 // on Intel which has so few registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
12535
a61af66fc99e Initial load
duke
parents:
diff changeset
12536 // Manifest a CmpL result in an integer register. Very painful.
a61af66fc99e Initial load
duke
parents:
diff changeset
12537 // This is the test to avoid.
a61af66fc99e Initial load
duke
parents:
diff changeset
12538 instruct cmpL3_reg_reg(eSIRegI dst, eRegL src1, eRegL src2, eFlagsReg flags ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12539 match(Set dst (CmpL3 src1 src2));
a61af66fc99e Initial load
duke
parents:
diff changeset
12540 effect( KILL flags );
a61af66fc99e Initial load
duke
parents:
diff changeset
12541 ins_cost(1000);
a61af66fc99e Initial load
duke
parents:
diff changeset
12542 format %{ "XOR $dst,$dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12543 "CMP $src1.hi,$src2.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12544 "JLT,s m_one\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12545 "JGT,s p_one\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12546 "CMP $src1.lo,$src2.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12547 "JB,s m_one\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12548 "JEQ,s done\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
12549 "p_one:\tINC $dst\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12550 "JMP,s done\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
12551 "m_one:\tDEC $dst\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
12552 "done:" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12553 ins_encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12554 Label p_one, m_one, done;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
12555 __ xorptr($dst$$Register, $dst$$Register);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12556 __ cmpl(HIGH_FROM_LOW($src1$$Register), HIGH_FROM_LOW($src2$$Register));
a61af66fc99e Initial load
duke
parents:
diff changeset
12557 __ jccb(Assembler::less, m_one);
a61af66fc99e Initial load
duke
parents:
diff changeset
12558 __ jccb(Assembler::greater, p_one);
a61af66fc99e Initial load
duke
parents:
diff changeset
12559 __ cmpl($src1$$Register, $src2$$Register);
a61af66fc99e Initial load
duke
parents:
diff changeset
12560 __ jccb(Assembler::below, m_one);
a61af66fc99e Initial load
duke
parents:
diff changeset
12561 __ jccb(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
12562 __ bind(p_one);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
12563 __ incrementl($dst$$Register);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12564 __ jmpb(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
12565 __ bind(m_one);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 235
diff changeset
12566 __ decrementl($dst$$Register);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12567 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
12568 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12569 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12570 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12571
a61af66fc99e Initial load
duke
parents:
diff changeset
12572 //======
a61af66fc99e Initial load
duke
parents:
diff changeset
12573 // Manifest a CmpL result in the normal flags. Only good for LT or GE
a61af66fc99e Initial load
duke
parents:
diff changeset
12574 // compares. Can be used for LE or GT compares by reversing arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
12575 // NOT GOOD FOR EQ/NE tests.
a61af66fc99e Initial load
duke
parents:
diff changeset
12576 instruct cmpL_zero_flags_LTGE( flagsReg_long_LTGE flags, eRegL src, immL0 zero ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12577 match( Set flags (CmpL src zero ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12578 ins_cost(100);
a61af66fc99e Initial load
duke
parents:
diff changeset
12579 format %{ "TEST $src.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12580 opcode(0x85);
a61af66fc99e Initial load
duke
parents:
diff changeset
12581 ins_encode( OpcP, RegReg_Hi2( src, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12582 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12583 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12584
a61af66fc99e Initial load
duke
parents:
diff changeset
12585 // Manifest a CmpL result in the normal flags. Only good for LT or GE
a61af66fc99e Initial load
duke
parents:
diff changeset
12586 // compares. Can be used for LE or GT compares by reversing arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
12587 // NOT GOOD FOR EQ/NE tests.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12588 instruct cmpL_reg_flags_LTGE( flagsReg_long_LTGE flags, eRegL src1, eRegL src2, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12589 match( Set flags (CmpL src1 src2 ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12590 effect( TEMP tmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
12591 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12592 format %{ "CMP $src1.lo,$src2.lo\t! Long compare; set flags for low bits\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12593 "MOV $tmp,$src1.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12594 "SBB $tmp,$src2.hi\t! Compute flags for long compare" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12595 ins_encode( long_cmp_flags2( src1, src2, tmp ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12596 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12597 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12598
a61af66fc99e Initial load
duke
parents:
diff changeset
12599 // Long compares reg < zero/req OR reg >= zero/req.
a61af66fc99e Initial load
duke
parents:
diff changeset
12600 // Just a wrapper for a normal branch, plus the predicate test.
a61af66fc99e Initial load
duke
parents:
diff changeset
12601 instruct cmpL_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12602 match(If cmp flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
12603 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12604 predicate( _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge );
a61af66fc99e Initial load
duke
parents:
diff changeset
12605 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12606 jmpCon(cmp,flags,labl); // JLT or JGE...
a61af66fc99e Initial load
duke
parents:
diff changeset
12607 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12608 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12609
a61af66fc99e Initial load
duke
parents:
diff changeset
12610 // Compare 2 longs and CMOVE longs.
a61af66fc99e Initial load
duke
parents:
diff changeset
12611 instruct cmovLL_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12612 match(Set dst (CMoveL (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12613 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12614 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
12615 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12616 "CMOV$cmp $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12617 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12618 ins_encode( enc_cmov(cmp), RegReg_Lo2( dst, src ), enc_cmov(cmp), RegReg_Hi2( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12619 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12620 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12621
a61af66fc99e Initial load
duke
parents:
diff changeset
12622 instruct cmovLL_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegL dst, load_long_memory src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12623 match(Set dst (CMoveL (Binary cmp flags) (Binary dst (LoadL src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12624 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12625 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
12626 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12627 "CMOV$cmp $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12628 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12629 ins_encode( enc_cmov(cmp), RegMem(dst, src), enc_cmov(cmp), RegMem_Hi(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12630 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12631 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12632
a61af66fc99e Initial load
duke
parents:
diff changeset
12633 // Compare 2 longs and CMOVE ints.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12634 instruct cmovII_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12635 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12636 match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12637 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12638 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12639 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12640 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12641 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12642 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12643
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12644 instruct cmovII_mem_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12645 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12646 match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12647 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
12648 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12649 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12650 ins_encode( enc_cmov(cmp), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12651 ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
12652 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12653
a61af66fc99e Initial load
duke
parents:
diff changeset
12654 // Compare 2 longs and CMOVE ints.
a61af66fc99e Initial load
duke
parents:
diff changeset
12655 instruct cmovPP_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, eRegP dst, eRegP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12656 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12657 match(Set dst (CMoveP (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12658 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12659 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12660 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12661 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12662 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12663 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12664
a61af66fc99e Initial load
duke
parents:
diff changeset
12665 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12666 instruct cmovDDPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12667 predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge );
a61af66fc99e Initial load
duke
parents:
diff changeset
12668 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12669 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12670 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12671 fcmovDPR_regS(cmp,flags,dst,src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12672 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12673 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12674
a61af66fc99e Initial load
duke
parents:
diff changeset
12675 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12676 instruct cmovDD_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regD dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12677 predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge );
a61af66fc99e Initial load
duke
parents:
diff changeset
12678 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12679 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12680 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12681 fcmovD_regS(cmp,flags,dst,src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12682 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12683 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12684
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12685 instruct cmovFFPR_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regFPR dst, regFPR src) %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12686 predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12687 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12688 ins_cost(200);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12689 expand %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12690 fcmovFPR_regS(cmp,flags,dst,src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12691 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12692 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12693
a61af66fc99e Initial load
duke
parents:
diff changeset
12694 instruct cmovFF_reg_LTGE(cmpOp cmp, flagsReg_long_LTGE flags, regF dst, regF src) %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12695 predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ge );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12696 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12697 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12698 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12699 fcmovF_regS(cmp,flags,dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
12700 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12701 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12702
a61af66fc99e Initial load
duke
parents:
diff changeset
12703 //======
a61af66fc99e Initial load
duke
parents:
diff changeset
12704 // Manifest a CmpL result in the normal flags. Only good for EQ/NE compares.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12705 instruct cmpL_zero_flags_EQNE( flagsReg_long_EQNE flags, eRegL src, immL0 zero, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12706 match( Set flags (CmpL src zero ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12707 effect(TEMP tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
12708 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12709 format %{ "MOV $tmp,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12710 "OR $tmp,$src.hi\t! Long is EQ/NE 0?" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12711 ins_encode( long_cmp_flags0( src, tmp ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12712 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12713 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12714
a61af66fc99e Initial load
duke
parents:
diff changeset
12715 // Manifest a CmpL result in the normal flags. Only good for EQ/NE compares.
a61af66fc99e Initial load
duke
parents:
diff changeset
12716 instruct cmpL_reg_flags_EQNE( flagsReg_long_EQNE flags, eRegL src1, eRegL src2 ) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12717 match( Set flags (CmpL src1 src2 ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12718 ins_cost(200+300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12719 format %{ "CMP $src1.lo,$src2.lo\t! Long compare; set flags for low bits\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12720 "JNE,s skip\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12721 "CMP $src1.hi,$src2.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12722 "skip:\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12723 ins_encode( long_cmp_flags1( src1, src2 ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12724 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12725 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12726
a61af66fc99e Initial load
duke
parents:
diff changeset
12727 // Long compare reg == zero/reg OR reg != zero/reg
a61af66fc99e Initial load
duke
parents:
diff changeset
12728 // Just a wrapper for a normal branch, plus the predicate test.
a61af66fc99e Initial load
duke
parents:
diff changeset
12729 instruct cmpL_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12730 match(If cmp flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
12731 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12732 predicate( _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne );
a61af66fc99e Initial load
duke
parents:
diff changeset
12733 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12734 jmpCon(cmp,flags,labl); // JEQ or JNE...
a61af66fc99e Initial load
duke
parents:
diff changeset
12735 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12736 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12737
a61af66fc99e Initial load
duke
parents:
diff changeset
12738 // Compare 2 longs and CMOVE longs.
a61af66fc99e Initial load
duke
parents:
diff changeset
12739 instruct cmovLL_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12740 match(Set dst (CMoveL (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12741 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12742 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
12743 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12744 "CMOV$cmp $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12745 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12746 ins_encode( enc_cmov(cmp), RegReg_Lo2( dst, src ), enc_cmov(cmp), RegReg_Hi2( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12747 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12748 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12749
a61af66fc99e Initial load
duke
parents:
diff changeset
12750 instruct cmovLL_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegL dst, load_long_memory src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12751 match(Set dst (CMoveL (Binary cmp flags) (Binary dst (LoadL src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12752 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12753 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
12754 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12755 "CMOV$cmp $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12756 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12757 ins_encode( enc_cmov(cmp), RegMem(dst, src), enc_cmov(cmp), RegMem_Hi(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12758 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12759 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12760
a61af66fc99e Initial load
duke
parents:
diff changeset
12761 // Compare 2 longs and CMOVE ints.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12762 instruct cmovII_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12763 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12764 match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12765 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12766 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12767 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12768 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12769 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12770 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12771
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12772 instruct cmovII_mem_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12773 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12774 match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12775 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
12776 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12777 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12778 ins_encode( enc_cmov(cmp), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12779 ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
12780 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12781
a61af66fc99e Initial load
duke
parents:
diff changeset
12782 // Compare 2 longs and CMOVE ints.
a61af66fc99e Initial load
duke
parents:
diff changeset
12783 instruct cmovPP_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, eRegP dst, eRegP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12784 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12785 match(Set dst (CMoveP (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12786 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12787 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12788 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12789 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12790 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12791 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12792
a61af66fc99e Initial load
duke
parents:
diff changeset
12793 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12794 instruct cmovDDPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12795 predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne );
a61af66fc99e Initial load
duke
parents:
diff changeset
12796 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12797 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12798 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12799 fcmovDPR_regS(cmp,flags,dst,src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12800 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12801 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12802
a61af66fc99e Initial load
duke
parents:
diff changeset
12803 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12804 instruct cmovDD_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regD dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12805 predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne );
a61af66fc99e Initial load
duke
parents:
diff changeset
12806 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12807 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12808 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12809 fcmovD_regS(cmp,flags,dst,src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12810 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12811 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12812
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12813 instruct cmovFFPR_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regFPR dst, regFPR src) %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12814 predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12815 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12816 ins_cost(200);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12817 expand %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12818 fcmovFPR_regS(cmp,flags,dst,src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12819 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12820 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12821
a61af66fc99e Initial load
duke
parents:
diff changeset
12822 instruct cmovFF_reg_EQNE(cmpOp cmp, flagsReg_long_EQNE flags, regF dst, regF src) %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12823 predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::eq || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12824 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12825 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12826 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12827 fcmovF_regS(cmp,flags,dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
12828 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12829 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12830
a61af66fc99e Initial load
duke
parents:
diff changeset
12831 //======
a61af66fc99e Initial load
duke
parents:
diff changeset
12832 // Manifest a CmpL result in the normal flags. Only good for LE or GT compares.
a61af66fc99e Initial load
duke
parents:
diff changeset
12833 // Same as cmpL_reg_flags_LEGT except must negate src
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12834 instruct cmpL_zero_flags_LEGT( flagsReg_long_LEGT flags, eRegL src, immL0 zero, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12835 match( Set flags (CmpL src zero ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12836 effect( TEMP tmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
12837 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12838 format %{ "XOR $tmp,$tmp\t# Long compare for -$src < 0, use commuted test\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12839 "CMP $tmp,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12840 "SBB $tmp,$src.hi\n\t" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12841 ins_encode( long_cmp_flags3(src, tmp) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12842 ins_pipe( ialu_reg_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12843 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12844
a61af66fc99e Initial load
duke
parents:
diff changeset
12845 // Manifest a CmpL result in the normal flags. Only good for LE or GT compares.
a61af66fc99e Initial load
duke
parents:
diff changeset
12846 // Same as cmpL_reg_flags_LTGE except operands swapped. Swapping operands
a61af66fc99e Initial load
duke
parents:
diff changeset
12847 // requires a commuted test to get the same result.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12848 instruct cmpL_reg_flags_LEGT( flagsReg_long_LEGT flags, eRegL src1, eRegL src2, rRegI tmp ) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12849 match( Set flags (CmpL src1 src2 ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12850 effect( TEMP tmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
12851 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12852 format %{ "CMP $src2.lo,$src1.lo\t! Long compare, swapped operands, use with commuted test\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12853 "MOV $tmp,$src2.hi\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12854 "SBB $tmp,$src1.hi\t! Compute flags for long compare" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12855 ins_encode( long_cmp_flags2( src2, src1, tmp ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12856 ins_pipe( ialu_cr_reg_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12857 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12858
a61af66fc99e Initial load
duke
parents:
diff changeset
12859 // Long compares reg < zero/req OR reg >= zero/req.
a61af66fc99e Initial load
duke
parents:
diff changeset
12860 // Just a wrapper for a normal branch, plus the predicate test
a61af66fc99e Initial load
duke
parents:
diff changeset
12861 instruct cmpL_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, label labl) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12862 match(If cmp flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
12863 effect(USE labl);
a61af66fc99e Initial load
duke
parents:
diff changeset
12864 predicate( _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt || _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le );
a61af66fc99e Initial load
duke
parents:
diff changeset
12865 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12866 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12867 jmpCon(cmp,flags,labl); // JGT or JLE...
a61af66fc99e Initial load
duke
parents:
diff changeset
12868 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12869 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12870
a61af66fc99e Initial load
duke
parents:
diff changeset
12871 // Compare 2 longs and CMOVE longs.
a61af66fc99e Initial load
duke
parents:
diff changeset
12872 instruct cmovLL_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegL dst, eRegL src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12873 match(Set dst (CMoveL (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12874 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12875 ins_cost(400);
a61af66fc99e Initial load
duke
parents:
diff changeset
12876 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12877 "CMOV$cmp $dst.hi,$src.hi" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12878 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12879 ins_encode( enc_cmov(cmp), RegReg_Lo2( dst, src ), enc_cmov(cmp), RegReg_Hi2( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12880 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12881 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12882
a61af66fc99e Initial load
duke
parents:
diff changeset
12883 instruct cmovLL_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegL dst, load_long_memory src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12884 match(Set dst (CMoveL (Binary cmp flags) (Binary dst (LoadL src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12885 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12886 ins_cost(500);
a61af66fc99e Initial load
duke
parents:
diff changeset
12887 format %{ "CMOV$cmp $dst.lo,$src.lo\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
12888 "CMOV$cmp $dst.hi,$src.hi+4" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12889 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12890 ins_encode( enc_cmov(cmp), RegMem(dst, src), enc_cmov(cmp), RegMem_Hi(dst, src) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12891 ins_pipe( pipe_cmov_reg_long );
a61af66fc99e Initial load
duke
parents:
diff changeset
12892 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12893
a61af66fc99e Initial load
duke
parents:
diff changeset
12894 // Compare 2 longs and CMOVE ints.
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12895 instruct cmovII_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12896 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12897 match(Set dst (CMoveI (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12898 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12899 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12900 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12901 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12902 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12903 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12904
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
12905 instruct cmovII_mem_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, rRegI dst, memory src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12906 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12907 match(Set dst (CMoveI (Binary cmp flags) (Binary dst (LoadI src))));
a61af66fc99e Initial load
duke
parents:
diff changeset
12908 ins_cost(250);
a61af66fc99e Initial load
duke
parents:
diff changeset
12909 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12910 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12911 ins_encode( enc_cmov(cmp), RegMem( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12912 ins_pipe( pipe_cmov_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
12913 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12914
a61af66fc99e Initial load
duke
parents:
diff changeset
12915 // Compare 2 longs and CMOVE ptrs.
a61af66fc99e Initial load
duke
parents:
diff changeset
12916 instruct cmovPP_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, eRegP dst, eRegP src) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12917 predicate(VM_Version::supports_cmov() && ( _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt ));
a61af66fc99e Initial load
duke
parents:
diff changeset
12918 match(Set dst (CMoveP (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12919 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12920 format %{ "CMOV$cmp $dst,$src" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12921 opcode(0x0F,0x40);
a61af66fc99e Initial load
duke
parents:
diff changeset
12922 ins_encode( enc_cmov(cmp), RegReg( dst, src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
12923 ins_pipe( pipe_cmov_reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
12924 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12925
a61af66fc99e Initial load
duke
parents:
diff changeset
12926 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12927 instruct cmovDDPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regDPR dst, regDPR src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12928 predicate( UseSSE<=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt );
a61af66fc99e Initial load
duke
parents:
diff changeset
12929 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12930 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12931 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12932 fcmovDPR_regS(cmp,flags,dst,src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12933 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12934 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12935
a61af66fc99e Initial load
duke
parents:
diff changeset
12936 // Compare 2 longs and CMOVE doubles
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12937 instruct cmovDD_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regD dst, regD src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12938 predicate( UseSSE>=2 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt );
a61af66fc99e Initial load
duke
parents:
diff changeset
12939 match(Set dst (CMoveD (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12940 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12941 expand %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12942 fcmovD_regS(cmp,flags,dst,src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12943 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12944 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12945
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12946 instruct cmovFFPR_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regFPR dst, regFPR src) %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12947 predicate( UseSSE==0 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt );
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12948 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12949 ins_cost(200);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12950 expand %{
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12951 fcmovFPR_regS(cmp,flags,dst,src);
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12952 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12953 %}
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12954
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12955
a61af66fc99e Initial load
duke
parents:
diff changeset
12956 instruct cmovFF_reg_LEGT(cmpOp_commute cmp, flagsReg_long_LEGT flags, regF dst, regF src) %{
4761
65149e74c706 7121648: Use 3-operands SIMD instructions on x86 with AVX
kvn
parents: 4759
diff changeset
12957 predicate( UseSSE>=1 && _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le || _kids[0]->_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::gt );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12958 match(Set dst (CMoveF (Binary cmp flags) (Binary dst src)));
a61af66fc99e Initial load
duke
parents:
diff changeset
12959 ins_cost(200);
a61af66fc99e Initial load
duke
parents:
diff changeset
12960 expand %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12961 fcmovF_regS(cmp,flags,dst,src);
a61af66fc99e Initial load
duke
parents:
diff changeset
12962 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12963 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12964
a61af66fc99e Initial load
duke
parents:
diff changeset
12965
a61af66fc99e Initial load
duke
parents:
diff changeset
12966 // ============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
12967 // Procedure Call/Return Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
12968 // Call Java Static Instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
12969 // Note: If this code changes, the corresponding ret_addr_offset() and
a61af66fc99e Initial load
duke
parents:
diff changeset
12970 // compute_padding() functions will have to be adjusted.
a61af66fc99e Initial load
duke
parents:
diff changeset
12971 instruct CallStaticJavaDirect(method meth) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
12972 match(CallStaticJava);
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12973 predicate(! ((CallStaticJavaNode*)n)->is_method_handle_invoke());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12974 effect(USE meth);
a61af66fc99e Initial load
duke
parents:
diff changeset
12975
a61af66fc99e Initial load
duke
parents:
diff changeset
12976 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
12977 format %{ "CALL,static " %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12978 opcode(0xE8); /* E8 cd */
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
12979 ins_encode( pre_call_resets,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
12980 Java_Static_Call( meth ),
a61af66fc99e Initial load
duke
parents:
diff changeset
12981 call_epilog,
a61af66fc99e Initial load
duke
parents:
diff changeset
12982 post_call_FPU );
a61af66fc99e Initial load
duke
parents:
diff changeset
12983 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
12984 ins_alignment(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
12985 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
12986
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12987 // Call Java Static Instruction (method handle version)
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12988 // Note: If this code changes, the corresponding ret_addr_offset() and
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12989 // compute_padding() functions will have to be adjusted.
1567
110501f54a99 6934104: JSR 292 needs to support SPARC C2
twisti
parents: 1396
diff changeset
12990 instruct CallStaticJavaHandle(method meth, eBPRegP ebp_mh_SP_save) %{
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12991 match(CallStaticJava);
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12992 predicate(((CallStaticJavaNode*)n)->is_method_handle_invoke());
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12993 effect(USE meth);
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12994 // EBP is saved by all callees (for interpreter stack correction).
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12995 // We use it here for a similar purpose, in {preserve,restore}_SP.
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12996
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12997 ins_cost(300);
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12998 format %{ "CALL,static/MethodHandle " %}
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
12999 opcode(0xE8); /* E8 cd */
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
13000 ins_encode( pre_call_resets,
1137
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13001 preserve_SP,
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13002 Java_Static_Call( meth ),
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13003 restore_SP,
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13004 call_epilog,
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13005 post_call_FPU );
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13006 ins_pipe( pipe_slow );
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13007 ins_alignment(4);
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13008 %}
97125851f396 6829187: compiler optimizations required for JSR 292
twisti
parents: 989
diff changeset
13009
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13010 // Call Java Dynamic Instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
13011 // Note: If this code changes, the corresponding ret_addr_offset() and
a61af66fc99e Initial load
duke
parents:
diff changeset
13012 // compute_padding() functions will have to be adjusted.
a61af66fc99e Initial load
duke
parents:
diff changeset
13013 instruct CallDynamicJavaDirect(method meth) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13014 match(CallDynamicJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
13015 effect(USE meth);
a61af66fc99e Initial load
duke
parents:
diff changeset
13016
a61af66fc99e Initial load
duke
parents:
diff changeset
13017 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13018 format %{ "MOV EAX,(oop)-1\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
13019 "CALL,dynamic" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13020 opcode(0xE8); /* E8 cd */
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
13021 ins_encode( pre_call_resets,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13022 Java_Dynamic_Call( meth ),
a61af66fc99e Initial load
duke
parents:
diff changeset
13023 call_epilog,
a61af66fc99e Initial load
duke
parents:
diff changeset
13024 post_call_FPU );
a61af66fc99e Initial load
duke
parents:
diff changeset
13025 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
13026 ins_alignment(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
13027 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13028
a61af66fc99e Initial load
duke
parents:
diff changeset
13029 // Call Runtime Instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
13030 instruct CallRuntimeDirect(method meth) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13031 match(CallRuntime );
a61af66fc99e Initial load
duke
parents:
diff changeset
13032 effect(USE meth);
a61af66fc99e Initial load
duke
parents:
diff changeset
13033
a61af66fc99e Initial load
duke
parents:
diff changeset
13034 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13035 format %{ "CALL,runtime " %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13036 opcode(0xE8); /* E8 cd */
a61af66fc99e Initial load
duke
parents:
diff changeset
13037 // Use FFREEs to clear entries in float stack
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
13038 ins_encode( pre_call_resets,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13039 FFree_Float_Stack_All,
a61af66fc99e Initial load
duke
parents:
diff changeset
13040 Java_To_Runtime( meth ),
a61af66fc99e Initial load
duke
parents:
diff changeset
13041 post_call_FPU );
a61af66fc99e Initial load
duke
parents:
diff changeset
13042 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
13043 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13044
a61af66fc99e Initial load
duke
parents:
diff changeset
13045 // Call runtime without safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
13046 instruct CallLeafDirect(method meth) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13047 match(CallLeaf);
a61af66fc99e Initial load
duke
parents:
diff changeset
13048 effect(USE meth);
a61af66fc99e Initial load
duke
parents:
diff changeset
13049
a61af66fc99e Initial load
duke
parents:
diff changeset
13050 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13051 format %{ "CALL_LEAF,runtime " %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13052 opcode(0xE8); /* E8 cd */
8873
e961c11b85fe 8011102: Clear AVX registers after return from JNI call
kvn
parents: 7637
diff changeset
13053 ins_encode( pre_call_resets,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13054 FFree_Float_Stack_All,
a61af66fc99e Initial load
duke
parents:
diff changeset
13055 Java_To_Runtime( meth ),
a61af66fc99e Initial load
duke
parents:
diff changeset
13056 Verify_FPU_For_Leaf, post_call_FPU );
a61af66fc99e Initial load
duke
parents:
diff changeset
13057 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
13058 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13059
a61af66fc99e Initial load
duke
parents:
diff changeset
13060 instruct CallLeafNoFPDirect(method meth) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13061 match(CallLeafNoFP);
a61af66fc99e Initial load
duke
parents:
diff changeset
13062 effect(USE meth);
a61af66fc99e Initial load
duke
parents:
diff changeset
13063
a61af66fc99e Initial load
duke
parents:
diff changeset
13064 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13065 format %{ "CALL_LEAF_NOFP,runtime " %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13066 opcode(0xE8); /* E8 cd */
a61af66fc99e Initial load
duke
parents:
diff changeset
13067 ins_encode(Java_To_Runtime(meth));
a61af66fc99e Initial load
duke
parents:
diff changeset
13068 ins_pipe( pipe_slow );
a61af66fc99e Initial load
duke
parents:
diff changeset
13069 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13070
a61af66fc99e Initial load
duke
parents:
diff changeset
13071
a61af66fc99e Initial load
duke
parents:
diff changeset
13072 // Return Instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
13073 // Remove the return address & jump to it.
a61af66fc99e Initial load
duke
parents:
diff changeset
13074 instruct Ret() %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13075 match(Return);
a61af66fc99e Initial load
duke
parents:
diff changeset
13076 format %{ "RET" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13077 opcode(0xC3);
a61af66fc99e Initial load
duke
parents:
diff changeset
13078 ins_encode(OpcP);
a61af66fc99e Initial load
duke
parents:
diff changeset
13079 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
13080 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13081
a61af66fc99e Initial load
duke
parents:
diff changeset
13082 // Tail Call; Jump from runtime stub to Java code.
a61af66fc99e Initial load
duke
parents:
diff changeset
13083 // Also known as an 'interprocedural jump'.
a61af66fc99e Initial load
duke
parents:
diff changeset
13084 // Target of jump will eventually return to caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
13085 // TailJump below removes the return address.
a61af66fc99e Initial load
duke
parents:
diff changeset
13086 instruct TailCalljmpInd(eRegP_no_EBP jump_target, eBXRegP method_oop) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13087 match(TailCall jump_target method_oop );
a61af66fc99e Initial load
duke
parents:
diff changeset
13088 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13089 format %{ "JMP $jump_target \t# EBX holds method oop" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13090 opcode(0xFF, 0x4); /* Opcode FF /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
13091 ins_encode( OpcP, RegOpc(jump_target) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13092 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
13093 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13094
a61af66fc99e Initial load
duke
parents:
diff changeset
13095
a61af66fc99e Initial load
duke
parents:
diff changeset
13096 // Tail Jump; remove the return address; jump to target.
a61af66fc99e Initial load
duke
parents:
diff changeset
13097 // TailCall above leaves the return address around.
a61af66fc99e Initial load
duke
parents:
diff changeset
13098 instruct tailjmpInd(eRegP_no_EBP jump_target, eAXRegP ex_oop) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13099 match( TailJump jump_target ex_oop );
a61af66fc99e Initial load
duke
parents:
diff changeset
13100 ins_cost(300);
a61af66fc99e Initial load
duke
parents:
diff changeset
13101 format %{ "POP EDX\t# pop return address into dummy\n\t"
a61af66fc99e Initial load
duke
parents:
diff changeset
13102 "JMP $jump_target " %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13103 opcode(0xFF, 0x4); /* Opcode FF /4 */
a61af66fc99e Initial load
duke
parents:
diff changeset
13104 ins_encode( enc_pop_rdx,
a61af66fc99e Initial load
duke
parents:
diff changeset
13105 OpcP, RegOpc(jump_target) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13106 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
13107 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13108
a61af66fc99e Initial load
duke
parents:
diff changeset
13109 // Create exception oop: created by stack-crawling runtime code.
a61af66fc99e Initial load
duke
parents:
diff changeset
13110 // Created exception is now available to this handler, and is setup
a61af66fc99e Initial load
duke
parents:
diff changeset
13111 // just prior to jumping to this handler. No code emitted.
a61af66fc99e Initial load
duke
parents:
diff changeset
13112 instruct CreateException( eAXRegP ex_oop )
a61af66fc99e Initial load
duke
parents:
diff changeset
13113 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13114 match(Set ex_oop (CreateEx));
a61af66fc99e Initial load
duke
parents:
diff changeset
13115
a61af66fc99e Initial load
duke
parents:
diff changeset
13116 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
13117 // use the following format syntax
a61af66fc99e Initial load
duke
parents:
diff changeset
13118 format %{ "# exception oop is in EAX; no code emitted" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13119 ins_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
13120 ins_pipe( empty );
a61af66fc99e Initial load
duke
parents:
diff changeset
13121 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13122
a61af66fc99e Initial load
duke
parents:
diff changeset
13123
a61af66fc99e Initial load
duke
parents:
diff changeset
13124 // Rethrow exception:
a61af66fc99e Initial load
duke
parents:
diff changeset
13125 // The exception oop will come in the first argument position.
a61af66fc99e Initial load
duke
parents:
diff changeset
13126 // Then JUMP (not call) to the rethrow stub code.
a61af66fc99e Initial load
duke
parents:
diff changeset
13127 instruct RethrowException()
a61af66fc99e Initial load
duke
parents:
diff changeset
13128 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13129 match(Rethrow);
a61af66fc99e Initial load
duke
parents:
diff changeset
13130
a61af66fc99e Initial load
duke
parents:
diff changeset
13131 // use the following format syntax
a61af66fc99e Initial load
duke
parents:
diff changeset
13132 format %{ "JMP rethrow_stub" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13133 ins_encode(enc_rethrow);
a61af66fc99e Initial load
duke
parents:
diff changeset
13134 ins_pipe( pipe_jmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
13135 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13136
a61af66fc99e Initial load
duke
parents:
diff changeset
13137 // inlined locking and unlocking
a61af66fc99e Initial load
duke
parents:
diff changeset
13138
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13139
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13140 instruct cmpFastLock( eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP scr) %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13141 match( Set cr (FastLock object box) );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13142 effect( TEMP tmp, TEMP scr, USE_KILL box );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13143 ins_cost(300);
4777
e9a5e0a812c8 7125896: Eliminate nested locks
kvn
parents: 4763
diff changeset
13144 format %{ "FASTLOCK $object,$box\t! kills $box,$tmp,$scr" %}
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13145 ins_encode( Fast_Lock(object,box,tmp,scr) );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13146 ins_pipe( pipe_slow );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13147 %}
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13148
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13149 instruct cmpFastUnlock( eFlagsReg cr, eRegP object, eAXRegP box, eRegP tmp ) %{
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13150 match( Set cr (FastUnlock object box) );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13151 effect( TEMP tmp, USE_KILL box );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13152 ins_cost(300);
4777
e9a5e0a812c8 7125896: Eliminate nested locks
kvn
parents: 4763
diff changeset
13153 format %{ "FASTUNLOCK $object,$box\t! kills $box,$tmp" %}
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13154 ins_encode( Fast_Unlock(object,box,tmp) );
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14495
diff changeset
13155 ins_pipe( pipe_slow );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13156 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13157
a61af66fc99e Initial load
duke
parents:
diff changeset
13158
a61af66fc99e Initial load
duke
parents:
diff changeset
13159
a61af66fc99e Initial load
duke
parents:
diff changeset
13160 // ============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
13161 // Safepoint Instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
13162 instruct safePoint_poll(eFlagsReg cr) %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13163 match(SafePoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
13164 effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
13165
a61af66fc99e Initial load
duke
parents:
diff changeset
13166 // TODO-FIXME: we currently poll at offset 0 of the safepoint polling page.
a61af66fc99e Initial load
duke
parents:
diff changeset
13167 // On SPARC that might be acceptable as we can generate the address with
a61af66fc99e Initial load
duke
parents:
diff changeset
13168 // just a sethi, saving an or. By polling at offset 0 we can end up
a61af66fc99e Initial load
duke
parents:
diff changeset
13169 // putting additional pressure on the index-0 in the D$. Because of
a61af66fc99e Initial load
duke
parents:
diff changeset
13170 // alignment (just like the situation at hand) the lower indices tend
a61af66fc99e Initial load
duke
parents:
diff changeset
13171 // to see more traffic. It'd be better to change the polling address
a61af66fc99e Initial load
duke
parents:
diff changeset
13172 // to offset 0 of the last $line in the polling page.
a61af66fc99e Initial load
duke
parents:
diff changeset
13173
a61af66fc99e Initial load
duke
parents:
diff changeset
13174 format %{ "TSTL #polladdr,EAX\t! Safepoint: poll for GC" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13175 ins_cost(125);
a61af66fc99e Initial load
duke
parents:
diff changeset
13176 size(6) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
13177 ins_encode( Safepoint_Poll() );
a61af66fc99e Initial load
duke
parents:
diff changeset
13178 ins_pipe( ialu_reg_mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
13179 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13180
4950
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13181
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13182 // ============================================================================
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13183 // This name is KNOWN by the ADLC and cannot be changed.
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13184 // The ADLC forces a 'TypeRawPtr::BOTTOM' output type
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13185 // for this guy.
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13186 instruct tlsLoadP(eRegP dst, eFlagsReg cr) %{
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13187 match(Set dst (ThreadLocal));
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13188 effect(DEF dst, KILL cr);
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13189
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13190 format %{ "MOV $dst, Thread::current()" %}
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13191 ins_encode %{
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13192 Register dstReg = as_Register($dst$$reg);
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13193 __ get_thread(dstReg);
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13194 %}
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13195 ins_pipe( ialu_reg_fat );
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13196 %}
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13197
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13198
9b8ce46870df 7145346: VerifyStackAtCalls is broken
kvn
parents: 4947
diff changeset
13199
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13200 //----------PEEPHOLE RULES-----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
13201 // These must follow all instruction definitions as they use the names
a61af66fc99e Initial load
duke
parents:
diff changeset
13202 // defined in the instructions definitions.
a61af66fc99e Initial load
duke
parents:
diff changeset
13203 //
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
13204 // peepmatch ( root_instr_name [preceding_instruction]* );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13205 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13206 // peepconstraint %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13207 // (instruction_number.operand_name relational_op instruction_number.operand_name
a61af66fc99e Initial load
duke
parents:
diff changeset
13208 // [, ...] );
a61af66fc99e Initial load
duke
parents:
diff changeset
13209 // // instruction numbers are zero-based using left to right order in peepmatch
a61af66fc99e Initial load
duke
parents:
diff changeset
13210 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13211 // peepreplace ( instr_name ( [instruction_number.operand_name]* ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13212 // // provide an instruction_number.operand_name for each operand that appears
a61af66fc99e Initial load
duke
parents:
diff changeset
13213 // // in the replacement instruction's match rule
a61af66fc99e Initial load
duke
parents:
diff changeset
13214 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13215 // ---------VM FLAGS---------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
13216 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13217 // All peephole optimizations can be turned off using -XX:-OptoPeephole
a61af66fc99e Initial load
duke
parents:
diff changeset
13218 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13219 // Each peephole rule is given an identifying number starting with zero and
a61af66fc99e Initial load
duke
parents:
diff changeset
13220 // increasing by one in the order seen by the parser. An individual peephole
a61af66fc99e Initial load
duke
parents:
diff changeset
13221 // can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=#
a61af66fc99e Initial load
duke
parents:
diff changeset
13222 // on the command-line.
a61af66fc99e Initial load
duke
parents:
diff changeset
13223 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13224 // ---------CURRENT LIMITATIONS----------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
13225 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13226 // Only match adjacent instructions in same basic block
a61af66fc99e Initial load
duke
parents:
diff changeset
13227 // Only equality constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
13228 // Only constraints between operands, not (0.dest_reg == EAX_enc)
a61af66fc99e Initial load
duke
parents:
diff changeset
13229 // Only one replacement instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
13230 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13231 // ---------EXAMPLE----------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
13232 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13233 // // pertinent parts of existing instructions in architecture description
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
13234 // instruct movI(rRegI dst, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13235 // match(Set dst (CopyI src));
a61af66fc99e Initial load
duke
parents:
diff changeset
13236 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13237 //
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
13238 // instruct incI_eReg(rRegI dst, immI1 src, eFlagsReg cr) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13239 // match(Set dst (AddI dst src));
a61af66fc99e Initial load
duke
parents:
diff changeset
13240 // effect(KILL cr);
a61af66fc99e Initial load
duke
parents:
diff changeset
13241 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13242 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13243 // // Change (inc mov) to lea
a61af66fc99e Initial load
duke
parents:
diff changeset
13244 // peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13245 // // increment preceeded by register-register move
a61af66fc99e Initial load
duke
parents:
diff changeset
13246 // peepmatch ( incI_eReg movI );
a61af66fc99e Initial load
duke
parents:
diff changeset
13247 // // require that the destination register of the increment
a61af66fc99e Initial load
duke
parents:
diff changeset
13248 // // match the destination register of the move
a61af66fc99e Initial load
duke
parents:
diff changeset
13249 // peepconstraint ( 0.dst == 1.dst );
a61af66fc99e Initial load
duke
parents:
diff changeset
13250 // // construct a replacement instruction that sets
a61af66fc99e Initial load
duke
parents:
diff changeset
13251 // // the destination to ( move's source register + one )
a61af66fc99e Initial load
duke
parents:
diff changeset
13252 // peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13253 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13254 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13255 // Implementation no longer uses movX instructions since
a61af66fc99e Initial load
duke
parents:
diff changeset
13256 // machine-independent system no longer uses CopyX nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
13257 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13258 // peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13259 // peepmatch ( incI_eReg movI );
a61af66fc99e Initial load
duke
parents:
diff changeset
13260 // peepconstraint ( 0.dst == 1.dst );
a61af66fc99e Initial load
duke
parents:
diff changeset
13261 // peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13262 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13263 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13264 // peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13265 // peepmatch ( decI_eReg movI );
a61af66fc99e Initial load
duke
parents:
diff changeset
13266 // peepconstraint ( 0.dst == 1.dst );
a61af66fc99e Initial load
duke
parents:
diff changeset
13267 // peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13268 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13269 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13270 // peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13271 // peepmatch ( addI_eReg_imm movI );
a61af66fc99e Initial load
duke
parents:
diff changeset
13272 // peepconstraint ( 0.dst == 1.dst );
a61af66fc99e Initial load
duke
parents:
diff changeset
13273 // peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13274 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13275 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13276 // peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13277 // peepmatch ( addP_eReg_imm movP );
a61af66fc99e Initial load
duke
parents:
diff changeset
13278 // peepconstraint ( 0.dst == 1.dst );
a61af66fc99e Initial load
duke
parents:
diff changeset
13279 // peepreplace ( leaP_eReg_immI( 0.dst 1.src 0.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13280 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13281
a61af66fc99e Initial load
duke
parents:
diff changeset
13282 // // Change load of spilled value to only a spill
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
13283 // instruct storeI(memory mem, rRegI src) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13284 // match(Set mem (StoreI mem src));
a61af66fc99e Initial load
duke
parents:
diff changeset
13285 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13286 //
6179
8c92982cbbc4 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 6143
diff changeset
13287 // instruct loadI(rRegI dst, memory mem) %{
0
a61af66fc99e Initial load
duke
parents:
diff changeset
13288 // match(Set dst (LoadI mem));
a61af66fc99e Initial load
duke
parents:
diff changeset
13289 // %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13290 //
a61af66fc99e Initial load
duke
parents:
diff changeset
13291 peephole %{
a61af66fc99e Initial load
duke
parents:
diff changeset
13292 peepmatch ( loadI storeI );
a61af66fc99e Initial load
duke
parents:
diff changeset
13293 peepconstraint ( 1.src == 0.dst, 1.mem == 0.mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
13294 peepreplace ( storeI( 1.mem 1.mem 1.src ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
13295 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
13296
a61af66fc99e Initial load
duke
parents:
diff changeset
13297 //----------SMARTSPILL RULES---------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
13298 // These must follow all instruction definitions as they use the names
a61af66fc99e Initial load
duke
parents:
diff changeset
13299 // defined in the instructions definitions.