annotate src/cpu/sparc/vm/assembler_sparc.hpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents 28bf941f445e
children f7d55ea6ee56
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 2008
diff changeset
2 * Copyright (c) 1997, 2011, 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: 1547
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
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: 1547
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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1911
diff changeset
25 #ifndef CPU_SPARC_VM_ASSEMBLER_SPARC_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1911
diff changeset
26 #define CPU_SPARC_VM_ASSEMBLER_SPARC_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1911
diff changeset
27
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class BiasedLockingCounters;
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // <sys/trap.h> promises that the system will not use traps 16-31
a61af66fc99e Initial load
duke
parents:
diff changeset
31 #define ST_RESERVED_FOR_USER_0 0x10
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 /* Written: David Ungar 4/19/97 */
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // Contains all the definitions needed for sparc assembly code generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Register aliases for parts of the system:
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // 64 bit values can be kept in g1-g5, o1-o5 and o7 and all 64 bits are safe
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // across context switches in V8+ ABI. Of course, there are no 64 bit regs
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // in V8 ABI. All 64 bits are preserved in V9 ABI for all registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // g2-g4 are scratch registers called "application globals". Their
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // meaning is reserved to the "compilation system"--which means us!
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // They are are not supposed to be touched by ordinary C code, although
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // highly-optimized C code might steal them for temps. They are safe
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // across thread switches, and the ABI requires that they be safe
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // across function calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 //
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // g1 and g3 are touched by more modules. V8 allows g1 to be clobbered
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // across func calls, and V8+ also allows g5 to be clobbered across
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // func calls. Also, g1 and g5 can get touched while doing shared
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // library loading.
a61af66fc99e Initial load
duke
parents:
diff changeset
54 //
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // We must not touch g7 (it is the thread-self register) and g6 is
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // reserved for certain tools. g0, of course, is always zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 //
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // (Sources: SunSoft Compilers Group, thread library engineers.)
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // %%%% The interpreter should be revisited to reduce global scratch regs.
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // This global always holds the current JavaThread pointer:
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 REGISTER_DECLARATION(Register, G2_thread , G2);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
65 REGISTER_DECLARATION(Register, G6_heapbase , G6);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // The following globals are part of the Java calling convention:
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 REGISTER_DECLARATION(Register, G5_method , G5);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 REGISTER_DECLARATION(Register, G5_megamorphic_method , G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 REGISTER_DECLARATION(Register, G5_inline_cache_reg , G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // The following globals are used for the new C1 & interpreter calling convention:
a61af66fc99e Initial load
duke
parents:
diff changeset
74 REGISTER_DECLARATION(Register, Gargs , G4); // pointing to the last argument
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // This local is used to preserve G2_thread in the interpreter and in stubs:
a61af66fc99e Initial load
duke
parents:
diff changeset
77 REGISTER_DECLARATION(Register, L7_thread_cache , L7);
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // These globals are used as scratch registers in the interpreter:
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 REGISTER_DECLARATION(Register, Gframe_size , G1); // SAME REG as G1_scratch
a61af66fc99e Initial load
duke
parents:
diff changeset
82 REGISTER_DECLARATION(Register, G1_scratch , G1); // also SAME
a61af66fc99e Initial load
duke
parents:
diff changeset
83 REGISTER_DECLARATION(Register, G3_scratch , G3);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 REGISTER_DECLARATION(Register, G4_scratch , G4);
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // These globals are used as short-lived scratch registers in the compiler:
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 REGISTER_DECLARATION(Register, Gtemp , G5);
a61af66fc99e Initial load
duke
parents:
diff changeset
89
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
90 // JSR 292 fixed register usages:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
91 REGISTER_DECLARATION(Register, G5_method_type , G5);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
92 REGISTER_DECLARATION(Register, G3_method_handle , G3);
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1513
diff changeset
93 REGISTER_DECLARATION(Register, L7_mh_SP_save , L7);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
94
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // The compiler requires that G5_megamorphic_method is G5_inline_cache_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // because a single patchable "set" instruction (NativeMovConstReg,
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // or NativeMovConstPatching for compiler1) instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // serves to set up either quantity, depending on whether the compiled
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // call site is an inline cache or is megamorphic. See the function
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // CompiledIC::set_to_megamorphic.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 //
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
102 // If a inline cache targets an interpreted method, then the
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
103 // G5 register will be used twice during the call. First,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
104 // the call site will be patched to load a compiledICHolder
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
105 // into G5. (This is an ordered pair of ic_klass, method.)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
106 // The c2i adapter will first check the ic_klass, then load
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
107 // G5_method with the method part of the pair just before
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
108 // jumping into the interpreter.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
109 //
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Note that G5_method is only the method-self for the interpreter,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // and is logically unrelated to G5_megamorphic_method.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 //
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // Invariants on G2_thread (the JavaThread pointer):
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // - it should not be used for any other purpose anywhere
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // - it must be re-initialized by StubRoutines::call_stub()
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // - it must be preserved around every use of call_VM
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // We can consider using g2/g3/g4 to cache more values than the
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // JavaThread, such as the card-marking base or perhaps pointers into
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // Eden. It's something of a waste to use them as scratch temporaries,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // since they are not supposed to be volatile. (Of course, if we find
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // that Java doesn't benefit from application globals, then we can just
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // use them as ordinary temporaries.)
a61af66fc99e Initial load
duke
parents:
diff changeset
124 //
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Since g1 and g5 (and/or g6) are the volatile (caller-save) registers,
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // it makes sense to use them routinely for procedure linkage,
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // whenever the On registers are not applicable. Examples: G5_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // G5_inline_cache_klass, and a double handful of miscellaneous compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // stubs. This means that compiler stubs, etc., should be kept to a
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // maximum of two or three G-register arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // stub frames
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 REGISTER_DECLARATION(Register, Lentry_args , L0); // pointer to args passed to callee (interpreter) not stub itself
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
140 REGISTER_DECLARATION(Register, Lstate , L0); // interpreter state object pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
141 REGISTER_DECLARATION(Register, L1_scratch , L1); // scratch
a61af66fc99e Initial load
duke
parents:
diff changeset
142 REGISTER_DECLARATION(Register, Lmirror , L1); // mirror (for native methods only)
a61af66fc99e Initial load
duke
parents:
diff changeset
143 REGISTER_DECLARATION(Register, L2_scratch , L2);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 REGISTER_DECLARATION(Register, L3_scratch , L3);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 REGISTER_DECLARATION(Register, L4_scratch , L4);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 REGISTER_DECLARATION(Register, Lscratch , L5); // C1 uses
a61af66fc99e Initial load
duke
parents:
diff changeset
147 REGISTER_DECLARATION(Register, Lscratch2 , L6); // C1 uses
a61af66fc99e Initial load
duke
parents:
diff changeset
148 REGISTER_DECLARATION(Register, L7_scratch , L7); // constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
149 REGISTER_DECLARATION(Register, O5_savedSP , O5);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 REGISTER_DECLARATION(Register, I5_savedSP , I5); // Saved SP before bumping for locals. This is simply
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // a copy SP, so in 64-bit it's a biased value. The bias
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // is added and removed as needed in the frame code.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Interface to signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
154 REGISTER_DECLARATION(Register, Llocals , L7); // pointer to locals for signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
155 REGISTER_DECLARATION(Register, Lmethod , L6); // methodOop when calling signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
158 REGISTER_DECLARATION(Register, Lesp , L0); // expression stack pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
159 REGISTER_DECLARATION(Register, Lbcp , L1); // pointer to next bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
160 REGISTER_DECLARATION(Register, Lmethod , L2);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 REGISTER_DECLARATION(Register, Llocals , L3);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 REGISTER_DECLARATION(Register, Largs , L3); // pointer to locals for signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // must match Llocals in asm interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
164 REGISTER_DECLARATION(Register, Lmonitors , L4);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 REGISTER_DECLARATION(Register, Lbyte_code , L5);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // When calling out from the interpreter we record SP so that we can remove any extra stack
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // space allocated during adapter transitions. This register is only live from the point
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // of the call until we return.
a61af66fc99e Initial load
duke
parents:
diff changeset
169 REGISTER_DECLARATION(Register, Llast_SP , L5);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 REGISTER_DECLARATION(Register, Lscratch , L5);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 REGISTER_DECLARATION(Register, Lscratch2 , L6);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 REGISTER_DECLARATION(Register, LcpoolCache , L6); // constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 REGISTER_DECLARATION(Register, O5_savedSP , O5);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 REGISTER_DECLARATION(Register, I5_savedSP , I5); // Saved SP before bumping for locals. This is simply
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // a copy SP, so in 64-bit it's a biased value. The bias
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // is added and removed as needed in the frame code.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 REGISTER_DECLARATION(Register, IdispatchTables , I4); // Base address of the bytecode dispatch tables
a61af66fc99e Initial load
duke
parents:
diff changeset
179 REGISTER_DECLARATION(Register, IdispatchAddress , I3); // Register which saves the dispatch address for each bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
180 REGISTER_DECLARATION(Register, ImethodDataPtr , I2); // Pointer to the current method data
a61af66fc99e Initial load
duke
parents:
diff changeset
181 #endif /* CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // NOTE: Lscratch2 and LcpoolCache point to the same registers in
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // the interpreter code. If Lscratch2 needs to be used for some
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // purpose than LcpoolCache should be restore after that for
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // the interpreter to work right
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // (These assignments must be compatible with L7_thread_cache; see above.)
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // Since Lbcp points into the middle of the method object,
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // it is temporarily converted into a "bcx" during GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Exception processing
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // These registers are passed into exception handlers.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // All exception handlers require the exception object being thrown.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // In addition, an nmethod's exception handler must be passed
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // the address of the call site within the nmethod, to allow
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // proper selection of the applicable catch block.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // (Interpreter frames use their own bcp() for this purpose.)
a61af66fc99e Initial load
duke
parents:
diff changeset
199 //
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // The Oissuing_pc value is not always needed. When jumping to a
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // handler that is known to be interpreted, the Oissuing_pc value can be
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // omitted. An actual catch block in compiled code receives (from its
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // nmethod's exception handler) the thrown exception in the Oexception,
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // but it doesn't need the Oissuing_pc.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 //
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // If an exception handler (either interpreted or compiled)
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // discovers there is no applicable catch block, it updates
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // the Oissuing_pc to the continuation PC of its own caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // pops back to that caller's stack frame, and executes that
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // caller's exception handler. Obviously, this process will
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // iterate until the control stack is popped back to a method
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // containing an applicable catch block. A key invariant is
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // that the Oissuing_pc value is always a value local to
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // the method whose exception handler is currently executing.
a61af66fc99e Initial load
duke
parents:
diff changeset
215 //
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Note: The issuing PC value is __not__ a raw return address (I7 value).
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // It is a "return pc", the address __following__ the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Raw return addresses are converted to issuing PCs by frame::pc(),
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // or by stubs. Issuing PCs can be used directly with PC range tables.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 //
a61af66fc99e Initial load
duke
parents:
diff changeset
221 REGISTER_DECLARATION(Register, Oexception , O0); // exception being thrown
a61af66fc99e Initial load
duke
parents:
diff changeset
222 REGISTER_DECLARATION(Register, Oissuing_pc , O1); // where the exception is coming from
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // These must occur after the declarations above
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #ifndef DONT_USE_REGISTER_DEFINES
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 #define Gthread AS_REGISTER(Register, Gthread)
a61af66fc99e Initial load
duke
parents:
diff changeset
229 #define Gmethod AS_REGISTER(Register, Gmethod)
a61af66fc99e Initial load
duke
parents:
diff changeset
230 #define Gmegamorphic_method AS_REGISTER(Register, Gmegamorphic_method)
a61af66fc99e Initial load
duke
parents:
diff changeset
231 #define Ginline_cache_reg AS_REGISTER(Register, Ginline_cache_reg)
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #define Gargs AS_REGISTER(Register, Gargs)
a61af66fc99e Initial load
duke
parents:
diff changeset
233 #define Lthread_cache AS_REGISTER(Register, Lthread_cache)
a61af66fc99e Initial load
duke
parents:
diff changeset
234 #define Gframe_size AS_REGISTER(Register, Gframe_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
235 #define Gtemp AS_REGISTER(Register, Gtemp)
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
238 #define Lstate AS_REGISTER(Register, Lstate)
a61af66fc99e Initial load
duke
parents:
diff changeset
239 #define Lesp AS_REGISTER(Register, Lesp)
a61af66fc99e Initial load
duke
parents:
diff changeset
240 #define L1_scratch AS_REGISTER(Register, L1_scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
241 #define Lmirror AS_REGISTER(Register, Lmirror)
a61af66fc99e Initial load
duke
parents:
diff changeset
242 #define L2_scratch AS_REGISTER(Register, L2_scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
243 #define L3_scratch AS_REGISTER(Register, L3_scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
244 #define L4_scratch AS_REGISTER(Register, L4_scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
245 #define Lscratch AS_REGISTER(Register, Lscratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
246 #define Lscratch2 AS_REGISTER(Register, Lscratch2)
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #define L7_scratch AS_REGISTER(Register, L7_scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
248 #define Ostate AS_REGISTER(Register, Ostate)
a61af66fc99e Initial load
duke
parents:
diff changeset
249 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #define Lesp AS_REGISTER(Register, Lesp)
a61af66fc99e Initial load
duke
parents:
diff changeset
251 #define Lbcp AS_REGISTER(Register, Lbcp)
a61af66fc99e Initial load
duke
parents:
diff changeset
252 #define Lmethod AS_REGISTER(Register, Lmethod)
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #define Llocals AS_REGISTER(Register, Llocals)
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #define Lmonitors AS_REGISTER(Register, Lmonitors)
a61af66fc99e Initial load
duke
parents:
diff changeset
255 #define Lbyte_code AS_REGISTER(Register, Lbyte_code)
a61af66fc99e Initial load
duke
parents:
diff changeset
256 #define Lscratch AS_REGISTER(Register, Lscratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
257 #define Lscratch2 AS_REGISTER(Register, Lscratch2)
a61af66fc99e Initial load
duke
parents:
diff changeset
258 #define LcpoolCache AS_REGISTER(Register, LcpoolCache)
a61af66fc99e Initial load
duke
parents:
diff changeset
259 #endif /* ! CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 #define Lentry_args AS_REGISTER(Register, Lentry_args)
a61af66fc99e Initial load
duke
parents:
diff changeset
262 #define I5_savedSP AS_REGISTER(Register, I5_savedSP)
a61af66fc99e Initial load
duke
parents:
diff changeset
263 #define O5_savedSP AS_REGISTER(Register, O5_savedSP)
a61af66fc99e Initial load
duke
parents:
diff changeset
264 #define IdispatchAddress AS_REGISTER(Register, IdispatchAddress)
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #define ImethodDataPtr AS_REGISTER(Register, ImethodDataPtr)
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #define IdispatchTables AS_REGISTER(Register, IdispatchTables)
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 #define Oexception AS_REGISTER(Register, Oexception)
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #define Oissuing_pc AS_REGISTER(Register, Oissuing_pc)
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Address is an abstraction used to represent a memory location.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 //
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // Note: A register location is represented via a Register, not
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // via an address for efficiency & simplicity reasons.
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 class Address VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 private:
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
281 Register _base; // Base register.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
282 RegisterOrConstant _index_or_disp; // Index register or constant displacement.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
283 RelocationHolder _rspec;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
284
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
285 public:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
286 Address() : _base(noreg), _index_or_disp(noreg) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
287
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
288 Address(Register base, RegisterOrConstant index_or_disp)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
289 : _base(base),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
290 _index_or_disp(index_or_disp) {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
291 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
292
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
293 Address(Register base, Register index)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
294 : _base(base),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
295 _index_or_disp(index) {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
296 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
297
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
298 Address(Register base, int disp)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
299 : _base(base),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
300 _index_or_disp(disp) {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
301 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
302
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
303 #ifdef ASSERT
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
304 // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
305 Address(Register base, ByteSize disp)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
306 : _base(base),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
307 _index_or_disp(in_bytes(disp)) {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
308 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309 #endif
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
310
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
311 // accessors
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
312 Register base() const { return _base; }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
313 Register index() const { return _index_or_disp.as_register(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
314 int disp() const { return _index_or_disp.as_constant(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
315
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
316 bool has_index() const { return _index_or_disp.is_register(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
317 bool has_disp() const { return _index_or_disp.is_constant(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
318
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
319 const relocInfo::relocType rtype() { return _rspec.type(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
320 const RelocationHolder& rspec() { return _rspec; }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
321
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
322 RelocationHolder rspec(int offset) const {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
323 return offset == 0 ? _rspec : _rspec.plus(offset);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
324 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
325
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
326 inline bool is_simm13(int offset = 0); // check disp+offset for overflow
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
327
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
328 Address plus_disp(int plusdisp) const { // bump disp by a small amount
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
329 assert(_index_or_disp.is_constant(), "must have a displacement");
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
330 Address a(base(), disp() + plusdisp);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
331 return a;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
332 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
333
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
334 Address after_save() const {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
335 Address a = (*this);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
336 a._base = a._base->after_save();
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
337 return a;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
338 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
339
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
340 Address after_restore() const {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
341 Address a = (*this);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
342 a._base = a._base->after_restore();
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
343 return a;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
344 }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
345
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
346 // Convert the raw encoding form into the form expected by the
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
347 // constructor for Address.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
348 static Address make_raw(int base, int index, int scale, int disp, bool disp_is_oop);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
349
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
350 friend class Assembler;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
351 };
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
352
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
353
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
354 class AddressLiteral VALUE_OBJ_CLASS_SPEC {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
355 private:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
356 address _address;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
357 RelocationHolder _rspec;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
358
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
359 RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
360 switch (rtype) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
361 case relocInfo::external_word_type:
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
362 return external_word_Relocation::spec(addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363 case relocInfo::internal_word_type:
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
364 return internal_word_Relocation::spec(addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
366 case relocInfo::opt_virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
367 return opt_virtual_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
368 case relocInfo::static_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
369 return static_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
370 case relocInfo::runtime_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
371 return runtime_call_Relocation::spec();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
373 case relocInfo::none:
a61af66fc99e Initial load
duke
parents:
diff changeset
374 return RelocationHolder();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
376 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return RelocationHolder();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
381 protected:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
382 // creation
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
383 AddressLiteral() : _address(NULL), _rspec(NULL) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
384
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385 public:
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
386 AddressLiteral(address addr, RelocationHolder const& rspec)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
387 : _address(addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
388 _rspec(rspec) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
389
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
390 // Some constructors to avoid casting at the call site.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
391 AddressLiteral(jobject obj, RelocationHolder const& rspec)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
392 : _address((address) obj),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
393 _rspec(rspec) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
394
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
395 AddressLiteral(intptr_t value, RelocationHolder const& rspec)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
396 : _address((address) value),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
397 _rspec(rspec) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
398
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
399 AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
400 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
401 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
402
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
403 // Some constructors to avoid casting at the call site.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
404 AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
405 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
406 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
407
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
408 AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
409 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
410 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
411
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
412 AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
413 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
414 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
415
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
416 AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
417 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
418 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
419
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
420 AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
421 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
422 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
423
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
424 AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
425 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
426 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
427
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 #ifdef _LP64
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
429 // 32-bit complains about a multiple declaration for int*.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
430 AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
431 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
432 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 #endif
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
434
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
435 AddressLiteral(oop addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
436 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
437 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
438
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
439 AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
440 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
441 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
442
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
443 AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
444 : _address((address) addr),
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
445 _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
446
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
447 intptr_t value() const { return (intptr_t) _address; }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
448 int low10() const;
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
449
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
450 const relocInfo::relocType rtype() const { return _rspec.type(); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
451 const RelocationHolder& rspec() const { return _rspec; }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
452
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
453 RelocationHolder rspec(int offset) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
454 return offset == 0 ? _rspec : _rspec.plus(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 };
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 inline Address RegisterImpl::address_in_saved_window() const {
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
460 return (Address(SP, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // Argument is an abstraction used to represent an outgoing
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // actual argument or an incoming formal parameter, whether
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // it resides in memory or in a register, in a manner consistent
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // with the SPARC Application Binary Interface, or ABI. This is
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // often referred to as the native or C calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 class Argument VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
473 int _number;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 bool _is_in;
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
477 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
478 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 n_register_parameters = 6, // only 6 registers may contain integer parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
480 n_float_register_parameters = 16 // Can have up to 16 floating registers
a61af66fc99e Initial load
duke
parents:
diff changeset
481 };
a61af66fc99e Initial load
duke
parents:
diff changeset
482 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
483 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 n_register_parameters = 6 // only 6 registers may contain integer parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
485 };
a61af66fc99e Initial load
duke
parents:
diff changeset
486 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // creation
a61af66fc99e Initial load
duke
parents:
diff changeset
489 Argument(int number, bool is_in) : _number(number), _is_in(is_in) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 int number() const { return _number; }
a61af66fc99e Initial load
duke
parents:
diff changeset
492 bool is_in() const { return _is_in; }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 bool is_out() const { return !is_in(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 Argument successor() const { return Argument(number() + 1, is_in()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 Argument as_in() const { return Argument(number(), true ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 Argument as_out() const { return Argument(number(), false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // locating register-based arguments:
a61af66fc99e Initial load
duke
parents:
diff changeset
500 bool is_register() const { return _number < n_register_parameters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // locating Floating Point register-based arguments:
a61af66fc99e Initial load
duke
parents:
diff changeset
504 bool is_float_register() const { return _number < n_float_register_parameters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 FloatRegister as_float_register() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 assert(is_float_register(), "must be a register argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
508 return as_FloatRegister(( number() *2 ) + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 FloatRegister as_double_register() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 assert(is_float_register(), "must be a register argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return as_FloatRegister(( number() *2 ));
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 Register as_register() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 assert(is_register(), "must be a register argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
518 return is_in() ? as_iRegister(number()) : as_oRegister(number());
a61af66fc99e Initial load
duke
parents:
diff changeset
519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // locating memory-based arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
522 Address as_address() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 assert(!is_register(), "must be a memory argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return address_in_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // When applied to a register-based argument, give the corresponding address
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // into the 6-word area "into which callee may store register arguments"
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // (This is a different place than the corresponding register-save area location.)
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
530 Address address_in_frame() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
533 const char* name() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 friend class Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 };
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // The SPARC Assembler: Pure assembler doing NO optimizations on the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
540 // level; i.e., what you write
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // is what you get. The Assembler is generating code into a CodeBuffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 class Assembler : public AbstractAssembler {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 static void print_instruction(int inst);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 static int patched_branch(int dest_pos, int inst, int inst_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
548 static int branch_destination(int inst, int pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 friend class AbstractAssembler;
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
552 friend class AddressLiteral;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // code patchers need various routines like inv_wdisp()
a61af66fc99e Initial load
duke
parents:
diff changeset
555 friend class NativeInstruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 friend class NativeGeneralJump;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 friend class Relocation;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 friend class Label;
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // op carries format info; see page 62 & 267
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 enum ops {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 call_op = 1, // fmt 1
a61af66fc99e Initial load
duke
parents:
diff changeset
565 branch_op = 0, // also sethi (fmt2)
a61af66fc99e Initial load
duke
parents:
diff changeset
566 arith_op = 2, // fmt 3, arith & misc
a61af66fc99e Initial load
duke
parents:
diff changeset
567 ldst_op = 3 // fmt 3, load/store
a61af66fc99e Initial load
duke
parents:
diff changeset
568 };
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 enum op2s {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 bpr_op2 = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
572 fb_op2 = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
573 fbp_op2 = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 br_op2 = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
575 bp_op2 = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
576 cb_op2 = 7, // V8
a61af66fc99e Initial load
duke
parents:
diff changeset
577 sethi_op2 = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
578 };
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 enum op3s {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // selected op3s
a61af66fc99e Initial load
duke
parents:
diff changeset
582 add_op3 = 0x00,
a61af66fc99e Initial load
duke
parents:
diff changeset
583 and_op3 = 0x01,
a61af66fc99e Initial load
duke
parents:
diff changeset
584 or_op3 = 0x02,
a61af66fc99e Initial load
duke
parents:
diff changeset
585 xor_op3 = 0x03,
a61af66fc99e Initial load
duke
parents:
diff changeset
586 sub_op3 = 0x04,
a61af66fc99e Initial load
duke
parents:
diff changeset
587 andn_op3 = 0x05,
a61af66fc99e Initial load
duke
parents:
diff changeset
588 orn_op3 = 0x06,
a61af66fc99e Initial load
duke
parents:
diff changeset
589 xnor_op3 = 0x07,
a61af66fc99e Initial load
duke
parents:
diff changeset
590 addc_op3 = 0x08,
a61af66fc99e Initial load
duke
parents:
diff changeset
591 mulx_op3 = 0x09,
a61af66fc99e Initial load
duke
parents:
diff changeset
592 umul_op3 = 0x0a,
a61af66fc99e Initial load
duke
parents:
diff changeset
593 smul_op3 = 0x0b,
a61af66fc99e Initial load
duke
parents:
diff changeset
594 subc_op3 = 0x0c,
a61af66fc99e Initial load
duke
parents:
diff changeset
595 udivx_op3 = 0x0d,
a61af66fc99e Initial load
duke
parents:
diff changeset
596 udiv_op3 = 0x0e,
a61af66fc99e Initial load
duke
parents:
diff changeset
597 sdiv_op3 = 0x0f,
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 addcc_op3 = 0x10,
a61af66fc99e Initial load
duke
parents:
diff changeset
600 andcc_op3 = 0x11,
a61af66fc99e Initial load
duke
parents:
diff changeset
601 orcc_op3 = 0x12,
a61af66fc99e Initial load
duke
parents:
diff changeset
602 xorcc_op3 = 0x13,
a61af66fc99e Initial load
duke
parents:
diff changeset
603 subcc_op3 = 0x14,
a61af66fc99e Initial load
duke
parents:
diff changeset
604 andncc_op3 = 0x15,
a61af66fc99e Initial load
duke
parents:
diff changeset
605 orncc_op3 = 0x16,
a61af66fc99e Initial load
duke
parents:
diff changeset
606 xnorcc_op3 = 0x17,
a61af66fc99e Initial load
duke
parents:
diff changeset
607 addccc_op3 = 0x18,
a61af66fc99e Initial load
duke
parents:
diff changeset
608 umulcc_op3 = 0x1a,
a61af66fc99e Initial load
duke
parents:
diff changeset
609 smulcc_op3 = 0x1b,
a61af66fc99e Initial load
duke
parents:
diff changeset
610 subccc_op3 = 0x1c,
a61af66fc99e Initial load
duke
parents:
diff changeset
611 udivcc_op3 = 0x1e,
a61af66fc99e Initial load
duke
parents:
diff changeset
612 sdivcc_op3 = 0x1f,
a61af66fc99e Initial load
duke
parents:
diff changeset
613
a61af66fc99e Initial load
duke
parents:
diff changeset
614 taddcc_op3 = 0x20,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 tsubcc_op3 = 0x21,
a61af66fc99e Initial load
duke
parents:
diff changeset
616 taddcctv_op3 = 0x22,
a61af66fc99e Initial load
duke
parents:
diff changeset
617 tsubcctv_op3 = 0x23,
a61af66fc99e Initial load
duke
parents:
diff changeset
618 mulscc_op3 = 0x24,
a61af66fc99e Initial load
duke
parents:
diff changeset
619 sll_op3 = 0x25,
a61af66fc99e Initial load
duke
parents:
diff changeset
620 sllx_op3 = 0x25,
a61af66fc99e Initial load
duke
parents:
diff changeset
621 srl_op3 = 0x26,
a61af66fc99e Initial load
duke
parents:
diff changeset
622 srlx_op3 = 0x26,
a61af66fc99e Initial load
duke
parents:
diff changeset
623 sra_op3 = 0x27,
a61af66fc99e Initial load
duke
parents:
diff changeset
624 srax_op3 = 0x27,
a61af66fc99e Initial load
duke
parents:
diff changeset
625 rdreg_op3 = 0x28,
a61af66fc99e Initial load
duke
parents:
diff changeset
626 membar_op3 = 0x28,
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 flushw_op3 = 0x2b,
a61af66fc99e Initial load
duke
parents:
diff changeset
629 movcc_op3 = 0x2c,
a61af66fc99e Initial load
duke
parents:
diff changeset
630 sdivx_op3 = 0x2d,
a61af66fc99e Initial load
duke
parents:
diff changeset
631 popc_op3 = 0x2e,
a61af66fc99e Initial load
duke
parents:
diff changeset
632 movr_op3 = 0x2f,
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 sir_op3 = 0x30,
a61af66fc99e Initial load
duke
parents:
diff changeset
635 wrreg_op3 = 0x30,
a61af66fc99e Initial load
duke
parents:
diff changeset
636 saved_op3 = 0x31,
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 fpop1_op3 = 0x34,
a61af66fc99e Initial load
duke
parents:
diff changeset
639 fpop2_op3 = 0x35,
a61af66fc99e Initial load
duke
parents:
diff changeset
640 impdep1_op3 = 0x36,
a61af66fc99e Initial load
duke
parents:
diff changeset
641 impdep2_op3 = 0x37,
a61af66fc99e Initial load
duke
parents:
diff changeset
642 jmpl_op3 = 0x38,
a61af66fc99e Initial load
duke
parents:
diff changeset
643 rett_op3 = 0x39,
a61af66fc99e Initial load
duke
parents:
diff changeset
644 trap_op3 = 0x3a,
a61af66fc99e Initial load
duke
parents:
diff changeset
645 flush_op3 = 0x3b,
a61af66fc99e Initial load
duke
parents:
diff changeset
646 save_op3 = 0x3c,
a61af66fc99e Initial load
duke
parents:
diff changeset
647 restore_op3 = 0x3d,
a61af66fc99e Initial load
duke
parents:
diff changeset
648 done_op3 = 0x3e,
a61af66fc99e Initial load
duke
parents:
diff changeset
649 retry_op3 = 0x3e,
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 lduw_op3 = 0x00,
a61af66fc99e Initial load
duke
parents:
diff changeset
652 ldub_op3 = 0x01,
a61af66fc99e Initial load
duke
parents:
diff changeset
653 lduh_op3 = 0x02,
a61af66fc99e Initial load
duke
parents:
diff changeset
654 ldd_op3 = 0x03,
a61af66fc99e Initial load
duke
parents:
diff changeset
655 stw_op3 = 0x04,
a61af66fc99e Initial load
duke
parents:
diff changeset
656 stb_op3 = 0x05,
a61af66fc99e Initial load
duke
parents:
diff changeset
657 sth_op3 = 0x06,
a61af66fc99e Initial load
duke
parents:
diff changeset
658 std_op3 = 0x07,
a61af66fc99e Initial load
duke
parents:
diff changeset
659 ldsw_op3 = 0x08,
a61af66fc99e Initial load
duke
parents:
diff changeset
660 ldsb_op3 = 0x09,
a61af66fc99e Initial load
duke
parents:
diff changeset
661 ldsh_op3 = 0x0a,
a61af66fc99e Initial load
duke
parents:
diff changeset
662 ldx_op3 = 0x0b,
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 ldstub_op3 = 0x0d,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 stx_op3 = 0x0e,
a61af66fc99e Initial load
duke
parents:
diff changeset
666 swap_op3 = 0x0f,
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 stwa_op3 = 0x14,
a61af66fc99e Initial load
duke
parents:
diff changeset
669 stxa_op3 = 0x1e,
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 ldf_op3 = 0x20,
a61af66fc99e Initial load
duke
parents:
diff changeset
672 ldfsr_op3 = 0x21,
a61af66fc99e Initial load
duke
parents:
diff changeset
673 ldqf_op3 = 0x22,
a61af66fc99e Initial load
duke
parents:
diff changeset
674 lddf_op3 = 0x23,
a61af66fc99e Initial load
duke
parents:
diff changeset
675 stf_op3 = 0x24,
a61af66fc99e Initial load
duke
parents:
diff changeset
676 stfsr_op3 = 0x25,
a61af66fc99e Initial load
duke
parents:
diff changeset
677 stqf_op3 = 0x26,
a61af66fc99e Initial load
duke
parents:
diff changeset
678 stdf_op3 = 0x27,
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 prefetch_op3 = 0x2d,
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 ldc_op3 = 0x30,
a61af66fc99e Initial load
duke
parents:
diff changeset
684 ldcsr_op3 = 0x31,
a61af66fc99e Initial load
duke
parents:
diff changeset
685 lddc_op3 = 0x33,
a61af66fc99e Initial load
duke
parents:
diff changeset
686 stc_op3 = 0x34,
a61af66fc99e Initial load
duke
parents:
diff changeset
687 stcsr_op3 = 0x35,
a61af66fc99e Initial load
duke
parents:
diff changeset
688 stdcq_op3 = 0x36,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 stdc_op3 = 0x37,
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 casa_op3 = 0x3c,
a61af66fc99e Initial load
duke
parents:
diff changeset
692 casxa_op3 = 0x3e,
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 alt_bit_op3 = 0x10,
a61af66fc99e Initial load
duke
parents:
diff changeset
695 cc_bit_op3 = 0x10
a61af66fc99e Initial load
duke
parents:
diff changeset
696 };
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 enum opfs {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // selected opfs
a61af66fc99e Initial load
duke
parents:
diff changeset
700 fmovs_opf = 0x01,
a61af66fc99e Initial load
duke
parents:
diff changeset
701 fmovd_opf = 0x02,
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 fnegs_opf = 0x05,
a61af66fc99e Initial load
duke
parents:
diff changeset
704 fnegd_opf = 0x06,
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 fadds_opf = 0x41,
a61af66fc99e Initial load
duke
parents:
diff changeset
707 faddd_opf = 0x42,
a61af66fc99e Initial load
duke
parents:
diff changeset
708 fsubs_opf = 0x45,
a61af66fc99e Initial load
duke
parents:
diff changeset
709 fsubd_opf = 0x46,
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 fmuls_opf = 0x49,
a61af66fc99e Initial load
duke
parents:
diff changeset
712 fmuld_opf = 0x4a,
a61af66fc99e Initial load
duke
parents:
diff changeset
713 fdivs_opf = 0x4d,
a61af66fc99e Initial load
duke
parents:
diff changeset
714 fdivd_opf = 0x4e,
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 fcmps_opf = 0x51,
a61af66fc99e Initial load
duke
parents:
diff changeset
717 fcmpd_opf = 0x52,
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 fstox_opf = 0x81,
a61af66fc99e Initial load
duke
parents:
diff changeset
720 fdtox_opf = 0x82,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 fxtos_opf = 0x84,
a61af66fc99e Initial load
duke
parents:
diff changeset
722 fxtod_opf = 0x88,
a61af66fc99e Initial load
duke
parents:
diff changeset
723 fitos_opf = 0xc4,
a61af66fc99e Initial load
duke
parents:
diff changeset
724 fdtos_opf = 0xc6,
a61af66fc99e Initial load
duke
parents:
diff changeset
725 fitod_opf = 0xc8,
a61af66fc99e Initial load
duke
parents:
diff changeset
726 fstod_opf = 0xc9,
a61af66fc99e Initial load
duke
parents:
diff changeset
727 fstoi_opf = 0xd1,
a61af66fc99e Initial load
duke
parents:
diff changeset
728 fdtoi_opf = 0xd2
a61af66fc99e Initial load
duke
parents:
diff changeset
729 };
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 enum RCondition { rc_z = 1, rc_lez = 2, rc_lz = 3, rc_nz = 5, rc_gz = 6, rc_gez = 7 };
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 enum Condition {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // for FBfcc & FBPfcc instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
735 f_never = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
736 f_notEqual = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
737 f_notZero = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
738 f_lessOrGreater = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
739 f_unorderedOrLess = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
740 f_less = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
741 f_unorderedOrGreater = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
742 f_greater = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
743 f_unordered = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
744 f_always = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
745 f_equal = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
746 f_zero = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
747 f_unorderedOrEqual = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
748 f_greaterOrEqual = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
749 f_unorderedOrGreaterOrEqual = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
750 f_lessOrEqual = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
751 f_unorderedOrLessOrEqual = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
752 f_ordered = 15,
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // V8 coproc, pp 123 v8 manual
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 cp_always = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
757 cp_never = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
758 cp_3 = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
759 cp_2 = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
760 cp_2or3 = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
761 cp_1 = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
762 cp_1or3 = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
763 cp_1or2 = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
764 cp_1or2or3 = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
765 cp_0 = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
766 cp_0or3 = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
767 cp_0or2 = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
768 cp_0or2or3 = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
769 cp_0or1 = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
770 cp_0or1or3 = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
771 cp_0or1or2 = 15,
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // for integers
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 never = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
777 equal = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
778 zero = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
779 lessEqual = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
780 less = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
781 lessEqualUnsigned = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
782 lessUnsigned = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
783 carrySet = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
784 negative = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
785 overflowSet = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
786 always = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
787 notEqual = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
788 notZero = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
789 greater = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
790 greaterEqual = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
791 greaterUnsigned = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
792 greaterEqualUnsigned = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
793 carryClear = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
794 positive = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
795 overflowClear = 15
a61af66fc99e Initial load
duke
parents:
diff changeset
796 };
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 enum CC {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 icc = 0, xcc = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // ptr_cc is the correct condition code for a pointer or intptr_t:
a61af66fc99e Initial load
duke
parents:
diff changeset
801 ptr_cc = NOT_LP64(icc) LP64_ONLY(xcc),
a61af66fc99e Initial load
duke
parents:
diff changeset
802 fcc0 = 0, fcc1 = 1, fcc2 = 2, fcc3 = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
803 };
a61af66fc99e Initial load
duke
parents:
diff changeset
804
a61af66fc99e Initial load
duke
parents:
diff changeset
805 enum PrefetchFcn {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 severalReads = 0, oneRead = 1, severalWritesAndPossiblyReads = 2, oneWrite = 3, page = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
807 };
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // Helper functions for groups of instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
811
a61af66fc99e Initial load
duke
parents:
diff changeset
812 enum Predict { pt = 1, pn = 0 }; // pt = predict taken
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 enum Membar_mask_bits { // page 184, v9
a61af66fc99e Initial load
duke
parents:
diff changeset
815 StoreStore = 1 << 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
816 LoadStore = 1 << 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
817 StoreLoad = 1 << 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
818 LoadLoad = 1 << 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 Sync = 1 << 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
821 MemIssue = 1 << 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
822 Lookaside = 1 << 4
a61af66fc99e Initial load
duke
parents:
diff changeset
823 };
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 // test if x is within signed immediate range for nbits
2121
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
826 static bool is_simm(intptr_t x, int nbits) { return -( intptr_t(1) << nbits-1 ) <= x && x < ( intptr_t(1) << nbits-1 ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 // test if -4096 <= x <= 4095
2121
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
829 static bool is_simm13(intptr_t x) { return is_simm(x, 13); }
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
830
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
831 static bool is_in_wdisp_range(address a, address b, int nbits) {
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
832 intptr_t d = intptr_t(b) - intptr_t(a);
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
833 return is_simm(d, nbits + 2);
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
834 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835
1848
c393f046f4c5 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 1846
diff changeset
836 // test if label is in simm16 range in words (wdisp16).
c393f046f4c5 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 1846
diff changeset
837 bool is_in_wdisp16_range(Label& L) {
2121
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
838 return is_in_wdisp_range(target(L), pc(), 16);
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
839 }
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
840 // test if the distance between two addresses fits in simm30 range in words
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
841 static bool is_in_wdisp30_range(address a, address b) {
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
842 return is_in_wdisp_range(a, b, 30);
1848
c393f046f4c5 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 1846
diff changeset
843 }
c393f046f4c5 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 1846
diff changeset
844
0
a61af66fc99e Initial load
duke
parents:
diff changeset
845 enum ASIs { // page 72, v9
a61af66fc99e Initial load
duke
parents:
diff changeset
846 ASI_PRIMARY = 0x80,
a61af66fc99e Initial load
duke
parents:
diff changeset
847 ASI_PRIMARY_LITTLE = 0x88
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // add more from book as needed
a61af66fc99e Initial load
duke
parents:
diff changeset
849 };
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // x is supposed to fit in a field "nbits" wide
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // and be sign-extended. Check the range.
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 static void assert_signed_range(intptr_t x, int nbits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 assert( nbits == 32
a61af66fc99e Initial load
duke
parents:
diff changeset
859 || -(1 << nbits-1) <= x && x < ( 1 << nbits-1),
a61af66fc99e Initial load
duke
parents:
diff changeset
860 "value out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 static void assert_signed_word_disp_range(intptr_t x, int nbits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 assert( (x & 3) == 0, "not word aligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
865 assert_signed_range(x, nbits + 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 static void assert_unsigned_const(int x, int nbits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 assert( juint(x) < juint(1 << nbits), "unsigned constant out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // fields: note bits numbered from LSB = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // fields known by inclusive bit range
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 static int fmask(juint hi_bit, juint lo_bit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
876 assert( hi_bit >= lo_bit && 0 <= lo_bit && hi_bit < 32, "bad bits");
a61af66fc99e Initial load
duke
parents:
diff changeset
877 return (1 << ( hi_bit-lo_bit + 1 )) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // inverse of u_field
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 static int inv_u_field(int x, int hi_bit, int lo_bit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 juint r = juint(x) >> lo_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 r &= fmask( hi_bit, lo_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 return int(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // signed version: extract from field and sign-extend
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 static int inv_s_field(int x, int hi_bit, int lo_bit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 int sign_shift = 31 - hi_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
893 return inv_u_field( ((x << sign_shift) >> sign_shift), hi_bit, lo_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // given a field that ranges from hi_bit to lo_bit (inclusive,
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // LSB = 0), and an unsigned value for the field,
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // shift it into the field
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
901 static int u_field(int x, int hi_bit, int lo_bit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
902 assert( ( x & ~fmask(hi_bit, lo_bit)) == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
903 "value out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
904 int r = x << lo_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
905 assert( inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
906 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // make sure this is inlined as it will reduce code size significantly
a61af66fc99e Initial load
duke
parents:
diff changeset
910 #define u_field(x, hi_bit, lo_bit) ((x) << (lo_bit))
a61af66fc99e Initial load
duke
parents:
diff changeset
911 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 static int inv_op( int x ) { return inv_u_field(x, 31, 30); }
a61af66fc99e Initial load
duke
parents:
diff changeset
914 static int inv_op2( int x ) { return inv_u_field(x, 24, 22); }
a61af66fc99e Initial load
duke
parents:
diff changeset
915 static int inv_op3( int x ) { return inv_u_field(x, 24, 19); }
a61af66fc99e Initial load
duke
parents:
diff changeset
916 static int inv_cond( int x ){ return inv_u_field(x, 28, 25); }
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 static bool inv_immed( int x ) { return (x & Assembler::immed(true)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 static Register inv_rd( int x ) { return as_Register(inv_u_field(x, 29, 25)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
921 static Register inv_rs1( int x ) { return as_Register(inv_u_field(x, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
922 static Register inv_rs2( int x ) { return as_Register(inv_u_field(x, 4, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924 static int op( int x) { return u_field(x, 31, 30); }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 static int rd( Register r) { return u_field(r->encoding(), 29, 25); }
a61af66fc99e Initial load
duke
parents:
diff changeset
926 static int fcn( int x) { return u_field(x, 29, 25); }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 static int op3( int x) { return u_field(x, 24, 19); }
a61af66fc99e Initial load
duke
parents:
diff changeset
928 static int rs1( Register r) { return u_field(r->encoding(), 18, 14); }
a61af66fc99e Initial load
duke
parents:
diff changeset
929 static int rs2( Register r) { return u_field(r->encoding(), 4, 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
930 static int annul( bool a) { return u_field(a ? 1 : 0, 29, 29); }
a61af66fc99e Initial load
duke
parents:
diff changeset
931 static int cond( int x) { return u_field(x, 28, 25); }
a61af66fc99e Initial load
duke
parents:
diff changeset
932 static int cond_mov( int x) { return u_field(x, 17, 14); }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 static int rcond( RCondition x) { return u_field(x, 12, 10); }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 static int op2( int x) { return u_field(x, 24, 22); }
a61af66fc99e Initial load
duke
parents:
diff changeset
935 static int predict( bool p) { return u_field(p ? 1 : 0, 19, 19); }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 static int branchcc( CC fcca) { return u_field(fcca, 21, 20); }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 static int cmpcc( CC fcca) { return u_field(fcca, 26, 25); }
a61af66fc99e Initial load
duke
parents:
diff changeset
938 static int imm_asi( int x) { return u_field(x, 12, 5); }
a61af66fc99e Initial load
duke
parents:
diff changeset
939 static int immed( bool i) { return u_field(i ? 1 : 0, 13, 13); }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 static int opf_low6( int w) { return u_field(w, 10, 5); }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 static int opf_low5( int w) { return u_field(w, 9, 5); }
a61af66fc99e Initial load
duke
parents:
diff changeset
942 static int trapcc( CC cc) { return u_field(cc, 12, 11); }
a61af66fc99e Initial load
duke
parents:
diff changeset
943 static int sx( int i) { return u_field(i, 12, 12); } // shift x=1 means 64-bit
a61af66fc99e Initial load
duke
parents:
diff changeset
944 static int opf( int x) { return u_field(x, 13, 5); }
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 static int opf_cc( CC c, bool useFloat ) { return u_field((useFloat ? 0 : 4) + c, 13, 11); }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 static int mov_cc( CC c, bool useFloat ) { return u_field(useFloat ? 0 : 1, 18, 18) | u_field(c, 12, 11); }
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 static int fd( FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 29, 25); };
a61af66fc99e Initial load
duke
parents:
diff changeset
950 static int fs1(FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 18, 14); };
a61af66fc99e Initial load
duke
parents:
diff changeset
951 static int fs2(FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 4, 0); };
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // some float instructions use this encoding on the op3 field
a61af66fc99e Initial load
duke
parents:
diff changeset
954 static int alt_op3(int op, FloatRegisterImpl::Width w) {
a61af66fc99e Initial load
duke
parents:
diff changeset
955 int r;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 switch(w) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 case FloatRegisterImpl::S: r = op + 0; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
958 case FloatRegisterImpl::D: r = op + 3; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
959 case FloatRegisterImpl::Q: r = op + 2; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 default: ShouldNotReachHere(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 return op3(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
963 }
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // compute inverse of simm
a61af66fc99e Initial load
duke
parents:
diff changeset
967 static int inv_simm(int x, int nbits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
968 return (int)(x << (32 - nbits)) >> (32 - nbits);
a61af66fc99e Initial load
duke
parents:
diff changeset
969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 static int inv_simm13( int x ) { return inv_simm(x, 13); }
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // signed immediate, in low bits, nbits long
a61af66fc99e Initial load
duke
parents:
diff changeset
974 static int simm(int x, int nbits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 assert_signed_range(x, nbits);
a61af66fc99e Initial load
duke
parents:
diff changeset
976 return x & (( 1 << nbits ) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // compute inverse of wdisp16
a61af66fc99e Initial load
duke
parents:
diff changeset
980 static intptr_t inv_wdisp16(int x, intptr_t pos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 int lo = x & (( 1 << 14 ) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
982 int hi = (x >> 20) & 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
983 if (hi >= 2) hi |= ~1;
a61af66fc99e Initial load
duke
parents:
diff changeset
984 return (((hi << 14) | lo) << 2) + pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // word offset, 14 bits at LSend, 2 bits at B21, B20
a61af66fc99e Initial load
duke
parents:
diff changeset
988 static int wdisp16(intptr_t x, intptr_t off) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 intptr_t xx = x - off;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 assert_signed_word_disp_range(xx, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
991 int r = (xx >> 2) & ((1 << 14) - 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
992 | ( ( (xx>>(2+14)) & 3 ) << 20 );
a61af66fc99e Initial load
duke
parents:
diff changeset
993 assert( inv_wdisp16(r, off) == x, "inverse is not inverse");
a61af66fc99e Initial load
duke
parents:
diff changeset
994 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 }
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // word displacement in low-order nbits bits
a61af66fc99e Initial load
duke
parents:
diff changeset
999
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 static intptr_t inv_wdisp( int x, intptr_t pos, int nbits ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 int pre_sign_extend = x & (( 1 << nbits ) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 int r = pre_sign_extend >= ( 1 << (nbits-1) )
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 ? pre_sign_extend | ~(( 1 << nbits ) - 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 : pre_sign_extend;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 return (r << 2) + pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 static int wdisp( intptr_t x, intptr_t off, int nbits ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 intptr_t xx = x - off;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 assert_signed_word_disp_range(xx, nbits);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 int r = (xx >> 2) & (( 1 << nbits ) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 assert( inv_wdisp( r, off, nbits ) == x, "inverse not inverse");
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // Extract the top 32 bits in a 64 bit word
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 static int32_t hi32( int64_t x ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 int32_t r = int32_t( (uint64_t)x >> 32 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // given a sethi instruction, extract the constant, left-justified
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 static int inv_hi22( int x ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 return x << 10;
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // create an imm22 field, given a 32-bit left-justified constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 static int hi22( int x ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 int r = int( juint(x) >> 10 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 assert( (r & ~((1 << 22) - 1)) == 0, "just checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 return r;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // create a low10 __value__ (not a field) for a given a 32-bit constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 static int low10( int x ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 return x & ((1 << 10) - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1039
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 // instruction only in v9
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 static void v9_only() { assert( VM_Version::v9_instructions_work(), "This instruction only works on SPARC V9"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // instruction only in v8
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 static void v8_only() { assert( VM_Version::v8_instructions_work(), "This instruction only works on SPARC V8"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 // instruction deprecated in v9
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 static void v9_dep() { } // do nothing for now
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // some float instructions only exist for single prec. on v8
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 static void v8_s_only(FloatRegisterImpl::Width w) { if (w != FloatRegisterImpl::S) v9_only(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // v8 has no CC field
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 static void v8_no_cc(CC cc) { if (cc) v9_only(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // Simple delay-slot scheme:
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // In order to check the programmer, the assembler keeps track of deley slots.
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // It forbids CTIs in delay slots (conservative, but should be OK).
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // Also, when putting an instruction into a delay slot, you must say
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // asm->delayed()->add(...), in order to check that you don't omit
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 // delay-slot instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // To implement this, we use a simple FSA
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 #define CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 enum Delay_state { no_delay, at_delay_slot, filling_delay_slot } delay_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // Tells assembler next instruction must NOT be in delay slot.
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 // Use at start of multinstruction macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 void assert_not_delayed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // This is a separate overloading to avoid creation of string constants
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // in non-asserted code--with some compilers this pollutes the object code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 assert_not_delayed("next instruction should not be a delay slot");
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 void assert_not_delayed(const char* msg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 #ifdef CHECK_DELAY
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1006
diff changeset
1083 assert(delay_state == no_delay, msg);
0
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
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // Delay slot helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // cti is called when emitting control-transfer instruction,
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // BEFORE doing the emitting.
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Only effective when assertion-checking is enabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 void cti() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 assert_not_delayed("cti should not be in delay slot");
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // called when emitting cti with a delay slot, AFTER emitting
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 void has_delay_slot() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 assert_not_delayed("just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 delay_state = at_delay_slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // Tells assembler you know that next instruction is delayed
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 Assembler* delayed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 assert ( delay_state == at_delay_slot, "delayed instruction is not in delay slot");
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 delay_state = filling_delay_slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 return this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 void flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 assert ( delay_state == no_delay, "ending code with a delay slot");
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 AbstractAssembler::flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 inline void emit_long(int); // shadows AbstractAssembler::emit_long
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 inline void emit_data(int x) { emit_long(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 inline void emit_data(int, RelocationHolder const&);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 inline void emit_data(int, relocInfo::relocType rtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // helper for above fcns
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 inline void check_delay();
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // instructions, refer to page numbers in the SPARC Architecture Manual, V9
a61af66fc99e Initial load
duke
parents:
diff changeset
1133
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // pp 135 (addc was addx in v8)
a61af66fc99e Initial load
duke
parents:
diff changeset
1135
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1136 inline void add(Register s1, Register s2, Register d );
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1137 inline void add(Register s1, int simm13a, Register d, relocInfo::relocType rtype = relocInfo::none);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1138 inline void add(Register s1, int simm13a, Register d, RelocationHolder const& rspec);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1139 inline void add(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
1911
fff777a71346 6994093: MethodHandle.invokeGeneric needs porting to SPARC
jrose
parents: 1848
diff changeset
1140 inline void add(const Address& a, Register d, int offset = 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 void addcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 void addcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 void addc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 void addc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 void addccc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 void addccc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // pp 136
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 inline void bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 inline void bpr( RCondition c, bool a, Predict p, Register s1, Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 protected: // use MacroAssembler::br instead
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // pp 138
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 inline void fb( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 inline void fb( Condition c, bool a, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1160
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // pp 141
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 inline void fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 inline void fbp( Condition c, bool a, CC cc, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 // pp 144
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 inline void br( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 inline void br( Condition c, bool a, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1172
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 // pp 146
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 inline void bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 inline void bp( Condition c, bool a, CC cc, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // pp 121 (V8)
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 inline void cb( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 inline void cb( Condition c, bool a, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // pp 149
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 inline void call( address d, relocInfo::relocType rt = relocInfo::runtime_call_type );
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 inline void call( Label& L, relocInfo::relocType rt = relocInfo::runtime_call_type );
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // pp 150
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // These instructions compare the contents of s2 with the contents of
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // memory at address in s1. If the values are equal, the contents of memory
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // at address s1 is swapped with the data in d. If the values are not equal,
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // the the contents of memory at s1 is loaded into d, without the swap.
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 void casa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(casa_op3 ) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void casxa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(casxa_op3) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 // pp 152
a61af66fc99e Initial load
duke
parents:
diff changeset
1199
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 void udiv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 void udiv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 void sdiv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 void sdiv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 void udivcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 void udivcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 void sdivcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 void sdivcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // pp 155
a61af66fc99e Initial load
duke
parents:
diff changeset
1210
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 void done() { v9_only(); cti(); emit_long( op(arith_op) | fcn(0) | op3(done_op3) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 void retry() { v9_only(); cti(); emit_long( op(arith_op) | fcn(1) | op3(retry_op3) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // pp 156
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 void fadd( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x40 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 void fsub( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x44 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // pp 157
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 void fcmp( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_long( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x50 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 void fcmpe( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_long( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x54 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // pp 159
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 void ftox( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x80 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 void ftoi( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0xd0 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // pp 160
a61af66fc99e Initial load
duke
parents:
diff changeset
1230
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 void ftof( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | opf(0xc0 + sw + dw*4) | fs2(s, sw)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // pp 161
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 void fxtof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x80 + w*4) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 void fitof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0xc0 + w*4) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1237
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // pp 162
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x00 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fnegs is the only instruction available
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // on v8 to do negation of single, double and quad precision floats.
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(sd, w)); else emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x05) | fs2(sd, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fabss is the only instruction available
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // on v8 to do abs operation on single/double/quad precision floats.
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 void fabs( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(sd, w)); else emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x09) | fs2(sd, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // pp 163
a61af66fc99e Initial load
duke
parents:
diff changeset
1257
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 void fmul( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x48 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 void fmul( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | fs1(s1, sw) | opf(0x60 + sw + dw*4) | fs2(s2, sw)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 void fdiv( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x4c + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // pp 164
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void fsqrt( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x28 + w) | fs2(s, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1265
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // pp 165
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 inline void flush( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 inline void flush( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // pp 167
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 void flushw() { v9_only(); emit_long( op(arith_op) | op3(flushw_op3) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // pp 168
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 void illtrap( int const22a) { if (const22a != 0) v9_only(); emit_long( op(branch_op) | u_field(const22a, 21, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 // v8 unimp == illtrap(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // pp 169
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 void impdep1( int id1, int const19a ) { v9_only(); emit_long( op(arith_op) | fcn(id1) | op3(impdep1_op3) | u_field(const19a, 18, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 void impdep2( int id1, int const19a ) { v9_only(); emit_long( op(arith_op) | fcn(id1) | op3(impdep2_op3) | u_field(const19a, 18, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1284
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // pp 149 (v8)
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 void cpop1( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_long( op(arith_op) | fcn(crd) | op3(impdep1_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 void cpop2( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_long( op(arith_op) | fcn(crd) | op3(impdep2_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1289
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 // pp 170
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 void jmpl( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 void jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec = RelocationHolder() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 // 171
a61af66fc99e Initial load
duke
parents:
diff changeset
1296
1006
dcf03e02b020 6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
twisti
parents: 986
diff changeset
1297 inline void ldf(FloatRegisterImpl::Width w, Register s1, RegisterOrConstant s2, FloatRegister d);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1298 inline void ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1299 inline void ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec = RelocationHolder());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1300
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1301 inline void ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset = 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
a61af66fc99e Initial load
duke
parents:
diff changeset
1303
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 inline void ldfsr( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 inline void ldfsr( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 inline void ldxfsr( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 inline void ldxfsr( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // pp 94 (v8)
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 inline void ldc( Register s1, Register s2, int crd );
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 inline void ldc( Register s1, int simm13a, int crd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 inline void lddc( Register s1, Register s2, int crd );
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 inline void lddc( Register s1, int simm13a, int crd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 inline void ldcsr( Register s1, Register s2, int crd );
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 inline void ldcsr( Register s1, int simm13a, int crd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // 173
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 void ldfa( FloatRegisterImpl::Width w, Register s1, Register s2, int ia, FloatRegister d ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 void ldfa( FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 // pp 175, lduw is ld on v8
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 inline void ldsb( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 inline void ldsb( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 inline void ldsh( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 inline void ldsh( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 inline void ldsw( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 inline void ldsw( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 inline void ldub( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 inline void ldub( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 inline void lduh( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 inline void lduh( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 inline void lduw( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 inline void lduw( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 inline void ldx( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 inline void ldx( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 inline void ld( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 inline void ld( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 inline void ldd( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 inline void ldd( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1345 #ifdef ASSERT
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1346 // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1347 inline void ld( Register s1, ByteSize simm13a, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1348 #endif
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1349
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1350 inline void ldsb(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1351 inline void ldsh(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1352 inline void ldsw(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1353 inline void ldub(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1354 inline void lduh(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1355 inline void lduw(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1356 inline void ldx( const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1357 inline void ld( const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1358 inline void ldd( const Address& a, Register d, int offset = 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1360 inline void ldub( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1361 inline void ldsb( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1362 inline void lduh( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1363 inline void ldsh( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1364 inline void lduw( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1365 inline void ldsw( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1366 inline void ldx( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1367 inline void ld( Register s1, RegisterOrConstant s2, Register d );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1368 inline void ldd( Register s1, RegisterOrConstant s2, Register d );
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
1369
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 // pp 177
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 void ldsba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 void ldsba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 void ldsha( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 void ldsha( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 void ldswa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 void ldswa( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 void lduba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 void lduba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 void lduha( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 void lduha( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 void lduwa( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 void lduwa( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 void ldxa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 void ldxa( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 void ldda( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 void ldda( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // pp 179
a61af66fc99e Initial load
duke
parents:
diff changeset
1390
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 inline void ldstub( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 inline void ldstub( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // pp 180
a61af66fc99e Initial load
duke
parents:
diff changeset
1395
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 void ldstuba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 void ldstuba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1398
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 // pp 181
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1401 void and3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | rs2(s2) ); }
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1402 void and3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 void andcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 void andcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 void andn( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 void andn( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1407 void andn( Register s1, RegisterOrConstant s2, Register d);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 void andncc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 void andncc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1410 void or3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | rs2(s2) ); }
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1411 void or3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 void orcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 void orcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 void orn( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 void orn( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 void orncc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 void orncc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1418 void xor3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | rs2(s2) ); }
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
1419 void xor3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 void xorcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 void xorcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 void xnor( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 void xnor( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 void xnorcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 void xnorcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // pp 183
a61af66fc99e Initial load
duke
parents:
diff changeset
1428
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 void membar( Membar_mask_bits const7a ) { v9_only(); emit_long( op(arith_op) | op3(membar_op3) | rs1(O7) | immed(true) | u_field( int(const7a), 6, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1430
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // pp 185
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 void fmov( FloatRegisterImpl::Width w, Condition c, bool floatCC, CC cca, FloatRegister s2, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop2_op3) | cond_mov(c) | opf_cc(cca, floatCC) | opf_low6(w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // pp 189
a61af66fc99e Initial load
duke
parents:
diff changeset
1436
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 void fmov( FloatRegisterImpl::Width w, RCondition c, Register s1, FloatRegister s2, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop2_op3) | rs1(s1) | rcond(c) | opf_low5(4 + w) | fs2(s2, w)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // pp 191
a61af66fc99e Initial load
duke
parents:
diff changeset
1440
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 void movcc( Condition c, bool floatCC, CC cca, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 void movcc( Condition c, bool floatCC, CC cca, int simm11a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | immed(true) | simm(simm11a, 11) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 // pp 195
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 void movr( RCondition c, Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 void movr( RCondition c, Register s1, int simm10a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | immed(true) | simm(simm10a, 10) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // pp 196
a61af66fc99e Initial load
duke
parents:
diff changeset
1450
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 void mulx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 void mulx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 void sdivx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 void sdivx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 void udivx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 void udivx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 // pp 197
a61af66fc99e Initial load
duke
parents:
diff changeset
1459
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 void umul( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 void umul( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 void smul( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 void smul( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 void umulcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 void umulcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 void smulcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 void smulcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 // pp 199
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 void mulscc( Register s1, Register s2, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 void mulscc( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // pp 201
a61af66fc99e Initial load
duke
parents:
diff changeset
1475
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 void nop() { emit_long( op(branch_op) | op2(sethi_op2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 // pp 202
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 void popc( Register s, Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(popc_op3) | rs2(s)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 void popc( int simm13a, Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(popc_op3) | immed(true) | simm(simm13a, 13)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1483
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 // pp 203
a61af66fc99e Initial load
duke
parents:
diff changeset
1485
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 void prefetch( Register s1, Register s2, PrefetchFcn f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 void prefetch( Register s1, int simm13a, PrefetchFcn f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 void prefetcha( Register s1, Register s2, int ia, PrefetchFcn f ) { v9_only(); emit_long( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 void prefetcha( Register s1, int simm13a, PrefetchFcn f ) { v9_only(); emit_long( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1490
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 inline void prefetch(const Address& a, PrefetchFcn F, int offset = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 // pp 208
a61af66fc99e Initial load
duke
parents:
diff changeset
1494
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 // not implementing read privileged register
a61af66fc99e Initial load
duke
parents:
diff changeset
1496
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 inline void rdy( Register d) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(0, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 inline void rdccr( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(2, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 inline void rdasi( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(3, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 inline void rdtick( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(4, 18, 14)); } // Spoon!
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 inline void rdpc( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(5, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 inline void rdfprs( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(6, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1503
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // pp 213
a61af66fc99e Initial load
duke
parents:
diff changeset
1505
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 inline void rett( Register s1, Register s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 inline void rett( Register s1, int simm13a, relocInfo::relocType rt = relocInfo::none);
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 // pp 214
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 void save( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | rs2(s2) ); }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1512 void save( Register s1, int simm13a, Register d ) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1513 // make sure frame is at least large enough for the register save area
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1514 assert(-simm13a >= 16 * wordSize, "frame too small");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1515 emit_long( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1516 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1517
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 void restore( Register s1 = G0, Register s2 = G0, Register d = G0 ) { emit_long( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 void restore( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1520
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // pp 216
a61af66fc99e Initial load
duke
parents:
diff changeset
1522
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 void saved() { v9_only(); emit_long( op(arith_op) | fcn(0) | op3(saved_op3)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 void restored() { v9_only(); emit_long( op(arith_op) | fcn(1) | op3(saved_op3)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 // pp 217
a61af66fc99e Initial load
duke
parents:
diff changeset
1527
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 inline void sethi( int imm22a, Register d, RelocationHolder const& rspec = RelocationHolder() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 // pp 218
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 void sll( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 void sll( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 void srl( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 void srl( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 void sra( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 void sra( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 void sllx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 void sllx( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 void srlx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 void srlx( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 void srax( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 void srax( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1544
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 // pp 220
a61af66fc99e Initial load
duke
parents:
diff changeset
1546
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 void sir( int simm13a ) { emit_long( op(arith_op) | fcn(15) | op3(sir_op3) | immed(true) | simm(simm13a, 13)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 // pp 221
a61af66fc99e Initial load
duke
parents:
diff changeset
1550
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 void stbar() { emit_long( op(arith_op) | op3(membar_op3) | u_field(15, 18, 14)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 // pp 222
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
1006
dcf03e02b020 6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
twisti
parents: 986
diff changeset
1555 inline void stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, RegisterOrConstant s2);
dcf03e02b020 6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
twisti
parents: 986
diff changeset
1556 inline void stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 inline void stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 inline void stf( FloatRegisterImpl::Width w, FloatRegister d, const Address& a, int offset = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 inline void stfsr( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 inline void stfsr( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 inline void stxfsr( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 inline void stxfsr( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 // pp 224
a61af66fc99e Initial load
duke
parents:
diff changeset
1566
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2, int ia ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // p 226
a61af66fc99e Initial load
duke
parents:
diff changeset
1571
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 inline void stb( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 inline void stb( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 inline void sth( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 inline void sth( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 inline void stw( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 inline void stw( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 inline void st( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 inline void st( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 inline void stx( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 inline void stx( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 inline void std( Register d, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 inline void std( Register d, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1584
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1585 #ifdef ASSERT
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1586 // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1587 inline void st( Register d, Register s1, ByteSize simm13a);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1588 #endif
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1589
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 inline void stb( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 inline void sth( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 inline void stw( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 inline void stx( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 inline void st( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 inline void std( Register d, const Address& a, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1596
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1597 inline void stb( Register d, Register s1, RegisterOrConstant s2 );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1598 inline void sth( Register d, Register s1, RegisterOrConstant s2 );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1599 inline void stw( Register d, Register s1, RegisterOrConstant s2 );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1600 inline void stx( Register d, Register s1, RegisterOrConstant s2 );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1601 inline void std( Register d, Register s1, RegisterOrConstant s2 );
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1602 inline void st( Register d, Register s1, RegisterOrConstant s2 );
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
1603
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 // pp 177
a61af66fc99e Initial load
duke
parents:
diff changeset
1605
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 void stba( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 void stba( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 void stha( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 void stha( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 void stwa( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 void stwa( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 void stxa( Register d, Register s1, Register s2, int ia ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 void stxa( Register d, Register s1, int simm13a ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 void stda( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 void stda( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1616
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 // pp 97 (v8)
a61af66fc99e Initial load
duke
parents:
diff changeset
1618
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 inline void stc( int crd, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 inline void stc( int crd, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 inline void stdc( int crd, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 inline void stdc( int crd, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 inline void stcsr( int crd, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 inline void stcsr( int crd, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 inline void stdcq( int crd, Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 inline void stdcq( int crd, Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1627
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 // pp 230
a61af66fc99e Initial load
duke
parents:
diff changeset
1629
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 void sub( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 void sub( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1632
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1633 // Note: offset is added to s2.
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1634 inline void sub(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1635
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 void subcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 void subcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 void subc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 void subc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 void subccc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 void subccc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1642
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 // pp 231
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 inline void swap( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 inline void swap( Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 inline void swap( Address& a, Register d, int offset = 0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1648
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 // pp 232
a61af66fc99e Initial load
duke
parents:
diff changeset
1650
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 void swapa( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 void swapa( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1653
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 // pp 234, note op in book is wrong, see pp 268
a61af66fc99e Initial load
duke
parents:
diff changeset
1655
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 void taddcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 void taddcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 void taddcctv( Register s1, Register s2, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 void taddcctv( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1660
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 // pp 235
a61af66fc99e Initial load
duke
parents:
diff changeset
1662
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 void tsubcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 void tsubcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 void tsubcctv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | rs2(s2) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 void tsubcctv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1667
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 // pp 237
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 void trap( Condition c, CC cc, Register s1, Register s2 ) { v8_no_cc(cc); emit_long( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | rs2(s2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 void trap( Condition c, CC cc, Register s1, int trapa ) { v8_no_cc(cc); emit_long( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | immed(true) | u_field(trapa, 6, 0)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 // simple uncond. trap
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 void trap( int trapa ) { trap( always, icc, G0, trapa ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 // pp 239 omit write priv register for now
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 inline void wry( Register d) { v9_dep(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(0, 29, 25)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 inline void wrccr(Register s) { v9_only(); emit_long( op(arith_op) | rs1(s) | op3(wrreg_op3) | u_field(2, 29, 25)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 inline void wrccr(Register s, int simm13a) { v9_only(); emit_long( op(arith_op) |
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 rs1(s) |
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 op3(wrreg_op3) |
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 u_field(2, 29, 25) |
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 u_field(1, 13, 13) |
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 simm(simm13a, 13)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 inline void wrasi( Register d) { v9_only(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(3, 29, 25)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 inline void wrfprs( Register d) { v9_only(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1687
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1688 // For a given register condition, return the appropriate condition code
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1689 // Condition (the one you would use to get the same effect after "tst" on
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1690 // the target register.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1691 Assembler::Condition reg_cond_to_cc_cond(RCondition in);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1692
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1693
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 // Creation
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 Assembler(CodeBuffer* code) : AbstractAssembler(code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 #ifdef CHECK_DELAY
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 delay_state = no_delay;
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 // Testing
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 void test_v9();
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 void test_v8_onlys();
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
a61af66fc99e Initial load
duke
parents:
diff changeset
1708
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 class RegistersForDebugging : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 intptr_t i[8], l[8], o[8], g[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 float f[32];
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 double d[32];
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 void print(outputStream* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 static int i_offset(int j) { return offset_of(RegistersForDebugging, i[j]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 static int l_offset(int j) { return offset_of(RegistersForDebugging, l[j]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 static int o_offset(int j) { return offset_of(RegistersForDebugging, o[j]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 static int g_offset(int j) { return offset_of(RegistersForDebugging, g[j]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 static int f_offset(int j) { return offset_of(RegistersForDebugging, f[j]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 static int d_offset(int j) { return offset_of(RegistersForDebugging, d[j / 2]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1723
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 // gen asm code to save regs
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 static void save_registers(MacroAssembler* a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1726
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 // restore global registers in case C code disturbed them
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 static void restore_registers(MacroAssembler* a, Register r);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1729
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1730
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1732
a61af66fc99e Initial load
duke
parents:
diff changeset
1733
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 // MacroAssembler extends Assembler by a few frequently used macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 // Most of the standard SPARC synthetic ops are defined here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 // Instructions for which a 'better' code sequence exists depending
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 // on arguments should also go in here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1739
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 #define JMP2(r1, r2) jmp(r1, r2, __FILE__, __LINE__)
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 #define JMP(r1, off) jmp(r1, off, __FILE__, __LINE__)
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1742 #define JUMP(a, temp, off) jump(a, temp, off, __FILE__, __LINE__)
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1743 #define JUMPL(a, temp, d, off) jumpl(a, temp, d, off, __FILE__, __LINE__)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1744
a61af66fc99e Initial load
duke
parents:
diff changeset
1745
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 class MacroAssembler: public Assembler {
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 // Support for VM calls
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // This is the base routine called by the different versions of call_VM_leaf. The interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 // may customize this version by overriding it for its purposes (e.g., to save/restore
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 // additional registers when doing a VM call).
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 #define VIRTUAL
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 #define VIRTUAL virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1757
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 VIRTUAL void call_VM_leaf_base(Register thread_cache, address entry_point, int number_of_arguments);
a61af66fc99e Initial load
duke
parents:
diff changeset
1759
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 // It is imperative that all calls into the VM are handled via the call_VM macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 // They make sure that the stack linkage is setup correctly. call_VM's correspond
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 // This is the base routine called by the different versions of call_VM. The interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 // may customize this version by overriding it for its purposes (e.g., to save/restore
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 // additional registers when doing a VM call).
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 // A non-volatile java_thread_cache register should be specified so
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 // that the G2_thread value can be preserved across the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 // (If java_thread_cache is noreg, then a slow get_thread call
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 // will re-initialize the G2_thread.) call_VM_base returns the register that contains the
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 // thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 // If no last_java_sp is specified (noreg) than SP will be used instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
1776
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 virtual void call_VM_base(
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 Register oop_result, // where an oop-result ends up if any; use noreg otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 Register java_thread_cache, // the thread if computed before ; use noreg otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 Register last_java_sp, // to set up last_Java_frame in stubs; use noreg otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 address entry_point, // the entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 int number_of_arguments, // the number of arguments (w/o thread) to pop after call
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 bool check_exception=true // flag which indicates if exception should be checked
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1785
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 // This routine should emit JVMTI PopFrame and ForceEarlyReturn handling code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 // The implementation is only non-empty for the InterpreterMacroAssembler,
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 // as only the interpreter handles and ForceEarlyReturn PopFrame requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 virtual void check_and_handle_popframe(Register scratch_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 virtual void check_and_handle_earlyret(Register scratch_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 MacroAssembler(CodeBuffer* code) : Assembler(code) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1794
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 // Support for NULL-checks
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 // Generates code that causes a NULL OS exception if the content of reg is NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 // If the accessed location is M[reg + offset] and the offset is known, provide the
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 // offset. No explicit code generation is needed if the offset is within a certain
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 // range (0 <= offset <= page_size).
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 // %%%%%% Currently not done for SPARC
a61af66fc99e Initial load
duke
parents:
diff changeset
1803
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 void null_check(Register reg, int offset = -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 static bool needs_explicit_null_check(intptr_t offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1806
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 // support for delayed instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 MacroAssembler* delayed() { Assembler::delayed(); return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1809
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 // branches that use right instruction for v8 vs. v9
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 inline void br( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 inline void br( Condition c, bool a, Predict p, Label& L );
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1813
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 inline void fb( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 inline void fb( Condition c, bool a, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1816
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 // compares register with zero and branches (V9 and V8 instructions)
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 void br_zero( Condition c, bool a, Predict p, Register s1, Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // Compares a pointer register with zero and branches on (not)null.
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 // Does a test & branch on 32-bit systems and a register-branch on 64-bit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 void br_null ( Register s1, bool a, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 void br_notnull( Register s1, bool a, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1823
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1824 // These versions will do the most efficient thing on v8 and v9. Perhaps
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1825 // this is what the routine above was meant to do, but it didn't (and
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1826 // didn't cover both target address kinds.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1827 void br_on_reg_cond( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt = relocInfo::none );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1828 void br_on_reg_cond( RCondition c, bool a, Predict p, Register s1, Label& L);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
1829
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 inline void bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 inline void bp( Condition c, bool a, CC cc, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1832
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 // Branch that tests xcc in LP64 and icc in !LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 inline void brx( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 inline void brx( Condition c, bool a, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1836
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 // unconditional short branch
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 inline void ba( bool a, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1839
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 // Branch that tests fp condition codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 inline void fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 inline void fbp( Condition c, bool a, CC cc, Predict p, Label& L );
a61af66fc99e Initial load
duke
parents:
diff changeset
1843
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 // get PC the best way
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 inline int get_pc( Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // Sparc shorthands(pp 85, V8 manual, pp 289 V9 manual)
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 inline void cmp( Register s1, Register s2 ) { subcc( s1, s2, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 inline void cmp( Register s1, int simm13a ) { subcc( s1, simm13a, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1850
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 inline void jmp( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 inline void jmp( Register s1, int simm13a, RelocationHolder const& rspec = RelocationHolder() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1853
2121
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
1854 // Check if the call target is out of wdisp30 range (relative to the code cache)
c17b998c5926 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 2076
diff changeset
1855 static inline bool is_far_target(address d);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 inline void call( address d, relocInfo::relocType rt = relocInfo::runtime_call_type );
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 inline void call( Label& L, relocInfo::relocType rt = relocInfo::runtime_call_type );
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 inline void callr( Register s1, Register s2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 inline void callr( Register s1, int simm13a, RelocationHolder const& rspec = RelocationHolder() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1860
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 // Emits nothing on V8
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 inline void iprefetch( address d, relocInfo::relocType rt = relocInfo::none );
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 inline void iprefetch( Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1864
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 inline void tst( Register s ) { orcc( G0, s, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1866
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 inline void ret( bool trace = TraceJumps ) { if (trace) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 mov(I7, O7); // traceable register
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 JMP(O7, 2 * BytesPerInstWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 jmpl( I7, 2 * BytesPerInstWord, G0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1875
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 inline void retl( bool trace = TraceJumps ) { if (trace) JMP(O7, 2 * BytesPerInstWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 else jmpl( O7, 2 * BytesPerInstWord, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 void ret( bool trace = TraceJumps );
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 void retl( bool trace = TraceJumps );
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1882
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 // Required platform-specific helpers for Label::patch_instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 // They _shadow_ the declarations in AbstractAssembler, which are undefined.
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 void pd_patch_instruction(address branch, address target);
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 static void pd_print_patched_instruction(address branch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1889
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 // sethi Macro handles optimizations and relocations
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1891 private:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1892 void internal_sethi(const AddressLiteral& addrlit, Register d, bool ForceRelocatable);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1893 public:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1894 void sethi(const AddressLiteral& addrlit, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1895 void patchable_sethi(const AddressLiteral& addrlit, Register d);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1896
2076
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1897 // compute the number of instructions for a sethi/set
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1898 static int insts_for_sethi( address a, bool worst_case = false );
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1899 static int worst_case_insts_for_set();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1900
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // set may be either setsw or setuw (high 32 bits may be zero or sign)
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1902 private:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1903 void internal_set(const AddressLiteral& al, Register d, bool ForceRelocatable);
2076
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1904 static int insts_for_internal_set(intptr_t value);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1905 public:
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1906 void set(const AddressLiteral& addrlit, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1907 void set(intptr_t value, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1908 void set(address addr, Register d, RelocationHolder const& rspec);
2076
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1909 static int insts_for_set(intptr_t value) { return insts_for_internal_set(value); }
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1910
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1911 void patchable_set(const AddressLiteral& addrlit, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1912 void patchable_set(intptr_t value, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
1913 void set64(jlong value, Register d, Register tmp);
2076
7737fa7ec2b5 7006044: materialize cheap non-oop pointers on 64-bit SPARC
twisti
parents: 2008
diff changeset
1914 static int insts_for_set64(jlong value);
2008
2f644f85485d 6961690: load oops from constant table on SPARC
twisti
parents: 2002
diff changeset
1915
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // sign-extend 32 to 64
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 inline void signx( Register s, Register d ) { sra( s, G0, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 inline void signx( Register d ) { sra( d, G0, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1919
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 inline void not1( Register s, Register d ) { xnor( s, G0, d ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 inline void not1( Register d ) { xnor( d, G0, d ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1922
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 inline void neg( Register s, Register d ) { sub( G0, s, d ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 inline void neg( Register d ) { sub( G0, d, d ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1925
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 inline void cas( Register s1, Register s2, Register d) { casa( s1, s2, d, ASI_PRIMARY); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 inline void casx( Register s1, Register s2, Register d) { casxa(s1, s2, d, ASI_PRIMARY); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 // Functions for isolating 64 bit atomic swaps for LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 // cas_ptr will perform cas for 32 bit VM's and casx for 64 bit VM's
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 inline void cas_ptr( Register s1, Register s2, Register d) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 casx( s1, s2, d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 cas( s1, s2, d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // Functions for isolating 64 bit shifts for LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 inline void sll_ptr( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 inline void sll_ptr( Register s1, int imm6a, Register d );
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
1941 inline void sll_ptr( Register s1, RegisterOrConstant s2, Register d );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 inline void srl_ptr( Register s1, Register s2, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 inline void srl_ptr( Register s1, int imm6a, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1944
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 // little-endian
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 inline void casl( Register s1, Register s2, Register d) { casa( s1, s2, d, ASI_PRIMARY_LITTLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 inline void casxl( Register s1, Register s2, Register d) { casxa(s1, s2, d, ASI_PRIMARY_LITTLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1948
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 inline void inc( Register d, int const13 = 1 ) { add( d, const13, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 inline void inccc( Register d, int const13 = 1 ) { addcc( d, const13, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1951
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 inline void dec( Register d, int const13 = 1 ) { sub( d, const13, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 inline void deccc( Register d, int const13 = 1 ) { subcc( d, const13, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1954
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 inline void btst( Register s1, Register s2 ) { andcc( s1, s2, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 inline void btst( int simm13a, Register s ) { andcc( s, simm13a, G0 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1957
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 inline void bset( Register s1, Register s2 ) { or3( s1, s2, s2 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 inline void bset( int simm13a, Register s ) { or3( s, simm13a, s ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1960
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 inline void bclr( Register s1, Register s2 ) { andn( s1, s2, s2 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 inline void bclr( int simm13a, Register s ) { andn( s, simm13a, s ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1963
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 inline void btog( Register s1, Register s2 ) { xor3( s1, s2, s2 ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 inline void btog( int simm13a, Register s ) { xor3( s, simm13a, s ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1966
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 inline void clr( Register d ) { or3( G0, G0, d ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1968
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 inline void clrb( Register s1, Register s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 inline void clrh( Register s1, Register s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 inline void clr( Register s1, Register s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 inline void clrx( Register s1, Register s2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1973
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 inline void clrb( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 inline void clrh( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 inline void clr( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 inline void clrx( Register s1, int simm13a);
a61af66fc99e Initial load
duke
parents:
diff changeset
1978
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 // copy & clear upper word
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 inline void clruw( Register s, Register d ) { srl( s, G0, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 // clear upper word
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 inline void clruwu( Register d ) { srl( d, G0, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1983
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // membar psuedo instruction. takes into account target memory model.
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 inline void membar( Assembler::Membar_mask_bits const7a );
a61af66fc99e Initial load
duke
parents:
diff changeset
1986
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // returns if membar generates anything.
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 inline bool membar_has_effect( Assembler::Membar_mask_bits const7a );
a61af66fc99e Initial load
duke
parents:
diff changeset
1989
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 // mov pseudo instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 inline void mov( Register s, Register d) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 if ( s != d ) or3( G0, s, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 else assert_not_delayed(); // Put something useful in the delay slot!
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1995
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 inline void mov_or_nop( Register s, Register d) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 if ( s != d ) or3( G0, s, d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 else nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2000
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 inline void mov( int simm13a, Register d) { or3( G0, simm13a, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2002
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 // address pseudos: make these names unlike instruction names to avoid confusion
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 inline intptr_t load_pc_address( Register reg, int bytes_to_skip );
1680
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2005 inline void load_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2006 inline void load_ptr_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2007 inline void store_contents(Register s, const AddressLiteral& addrlit, Register temp, int offset = 0);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2008 inline void store_ptr_contents(Register s, const AddressLiteral& addrlit, Register temp, int offset = 0);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2009 inline void jumpl_to(const AddressLiteral& addrlit, Register temp, Register d, int offset = 0);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2010 inline void jump_to(const AddressLiteral& addrlit, Register temp, int offset = 0);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2011 inline void jump_indirect_to(Address& a, Register temp, int ld_offset = 0, int jmp_offset = 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2012
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 // ring buffer traceable jumps
a61af66fc99e Initial load
duke
parents:
diff changeset
2014
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 void jmp2( Register r1, Register r2, const char* file, int line );
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 void jmp ( Register r1, int offset, const char* file, int line );
a61af66fc99e Initial load
duke
parents:
diff changeset
2017
1680
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2018 void jumpl(const AddressLiteral& addrlit, Register temp, Register d, int offset, const char* file, int line);
a64438a2b7e8 6958465: Sparc aten build24.0: openjdk-7.ea-b96 failed Error: Formal argument ... requires an lvalue
coleenp
parents: 1579
diff changeset
2019 void jump (const AddressLiteral& addrlit, Register temp, int offset, const char* file, int line);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2020
a61af66fc99e Initial load
duke
parents:
diff changeset
2021
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 // argument pseudos:
a61af66fc99e Initial load
duke
parents:
diff changeset
2023
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 inline void load_argument( Argument& a, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 inline void store_argument( Register s, Argument& a );
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 inline void store_ptr_argument( Register s, Argument& a );
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 inline void store_float_argument( FloatRegister s, Argument& a );
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 inline void store_double_argument( FloatRegister s, Argument& a );
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 inline void store_long_argument( Register s, Argument& a );
a61af66fc99e Initial load
duke
parents:
diff changeset
2030
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 // handy macros:
a61af66fc99e Initial load
duke
parents:
diff changeset
2032
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 inline void round_to( Register r, int modulus ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 assert_not_delayed();
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 inc( r, modulus - 1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 and3( r, -modulus, r );
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2038
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 // Functions for isolating 64 bit loads for LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // ld_ptr will perform ld for 32 bit VM's and ldx for 64 bit VM's
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // st_ptr will perform st for 32 bit VM's and stx for 64 bit VM's
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2044 inline void ld_ptr(Register s1, Register s2, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2045 inline void ld_ptr(Register s1, int simm13a, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2046 inline void ld_ptr(Register s1, RegisterOrConstant s2, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2047 inline void ld_ptr(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2048 inline void st_ptr(Register d, Register s1, Register s2);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2049 inline void st_ptr(Register d, Register s1, int simm13a);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2050 inline void st_ptr(Register d, Register s1, RegisterOrConstant s2);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2051 inline void st_ptr(Register d, const Address& a, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2052
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2053 #ifdef ASSERT
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2054 // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2055 inline void ld_ptr(Register s1, ByteSize simm13a, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2056 inline void st_ptr(Register d, Register s1, ByteSize simm13a);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2057 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2058
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2059 // ld_long will perform ldd for 32 bit VM's and ldx for 64 bit VM's
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2060 // st_long will perform std for 32 bit VM's and stx for 64 bit VM's
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2061 inline void ld_long(Register s1, Register s2, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2062 inline void ld_long(Register s1, int simm13a, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2063 inline void ld_long(Register s1, RegisterOrConstant s2, Register d);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2064 inline void ld_long(const Address& a, Register d, int offset = 0);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2065 inline void st_long(Register d, Register s1, Register s2);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2066 inline void st_long(Register d, Register s1, int simm13a);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2067 inline void st_long(Register d, Register s1, RegisterOrConstant s2);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2068 inline void st_long(Register d, const Address& a, int offset = 0);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
2069
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2070 // Helpers for address formation.
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2071 // - They emit only a move if s2 is a constant zero.
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2072 // - If dest is a constant and either s1 or s2 is a register, the temp argument is required and becomes the result.
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2073 // - If dest is a register and either s1 or s2 is a non-simm13 constant, the temp argument is required and used to materialize the constant.
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2074 RegisterOrConstant regcon_andn_ptr(RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2075 RegisterOrConstant regcon_inc_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2076 RegisterOrConstant regcon_sll_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2077
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2078 RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant src, Register temp) {
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2079 if (is_simm13(src.constant_or_zero()))
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2080 return src; // register or short constant
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2081 guarantee(temp != noreg, "constant offset overflow");
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2082 set(src.as_constant(), temp);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2083 return temp;
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2084 }
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2085
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2087
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 // traps as per trap.h (SPARC ABI?)
a61af66fc99e Initial load
duke
parents:
diff changeset
2090
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 void breakpoint_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 void breakpoint_trap(Condition c, CC cc = icc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 void flush_windows_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 void clean_windows_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 void get_psr_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 void set_psr_trap();
a61af66fc99e Initial load
duke
parents:
diff changeset
2097
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // V8/V9 flush_windows
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 void flush_windows();
a61af66fc99e Initial load
duke
parents:
diff changeset
2100
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 // Support for serializing memory accesses between threads
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 void serialize_memory(Register thread, Register tmp1, Register tmp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2103
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 // Stack frame creation/removal
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 void enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 void leave();
a61af66fc99e Initial load
duke
parents:
diff changeset
2107
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 // V8/V9 integer multiply
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 void mult(Register s1, Register s2, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 void mult(Register s1, int simm13a, Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2111
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 // V8/V9 read and write of condition codes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 void read_ccr(Register d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 void write_ccr(Register s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2115
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 // Manipulation of C++ bools
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 // These are idioms to flag the need for care with accessing bools but on
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 // this platform we assume byte size
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2120 inline void stbool(Register d, const Address& a) { stb(d, a); }
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2121 inline void ldbool(const Address& a, Register d) { ldsb(a, d); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 inline void tstbool( Register s ) { tst(s); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 inline void movbool( bool boolconst, Register d) { mov( (int) boolconst, d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2124
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2125 // klass oop manipulations if compressed
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 124
diff changeset
2126 void load_klass(Register src_oop, Register klass);
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 124
diff changeset
2127 void store_klass(Register klass, Register dst_oop);
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 164
diff changeset
2128 void store_klass_gap(Register s, Register dst_oop);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2129
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2130 // oop manipulations
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2131 void load_heap_oop(const Address& s, Register d);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2132 void load_heap_oop(Register s1, Register s2, Register d);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2133 void load_heap_oop(Register s1, int simm13a, Register d);
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1680
diff changeset
2134 void load_heap_oop(Register s1, RegisterOrConstant s2, Register d);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2135 void store_heap_oop(Register d, Register s1, Register s2);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2136 void store_heap_oop(Register d, Register s1, int simm13a);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2137 void store_heap_oop(Register d, const Address& a, int offset = 0);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2138
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2139 void encode_heap_oop(Register src, Register dst);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2140 void encode_heap_oop(Register r) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2141 encode_heap_oop(r, r);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2142 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2143 void decode_heap_oop(Register src, Register dst);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2144 void decode_heap_oop(Register r) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2145 decode_heap_oop(r, r);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2146 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2147 void encode_heap_oop_not_null(Register r);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2148 void decode_heap_oop_not_null(Register r);
124
b130b98db9cf 6689060: Escape Analysis does not work with Compressed Oops
kvn
parents: 113
diff changeset
2149 void encode_heap_oop_not_null(Register src, Register dst);
b130b98db9cf 6689060: Escape Analysis does not work with Compressed Oops
kvn
parents: 113
diff changeset
2150 void decode_heap_oop_not_null(Register src, Register dst);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2151
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 // Support for managing the JavaThread pointer (i.e.; the reference to
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 // thread-local information).
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 void get_thread(); // load G2_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 void verify_thread(); // verify G2_thread contents
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 void save_thread (const Register threache); // save to cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 void restore_thread(const Register thread_cache); // restore from cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2158
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 // Support for last Java frame (but use call_VM instead where possible)
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 void set_last_Java_frame(Register last_java_sp, Register last_Java_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 void reset_last_Java_frame(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 // Call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 // Passes the thread pointer (in O0) as a prepended argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 // Makes sure oop return values are visible to the GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 void call_VM(Register oop_result, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2170
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 // these overloadings are not presently used on SPARC:
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 void call_VM(Register oop_result, Register last_java_sp, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 void call_VM_leaf(Register thread_cache, address entry_point, int number_of_arguments = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1, Register arg_2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1, Register arg_2, Register arg_3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 void get_vm_result (Register oop_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 void get_vm_result_2(Register oop_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2184
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 // vm result is currently getting hijacked to for oop preservation
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 void set_vm_result(Register oop_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2187
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 // if call_VM_base was called with check_exceptions=false, then call
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 // check_and_forward_exception to handle exceptions when it is safe
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 void check_and_forward_exception(Register scratch_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2191
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 // For V8
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 void read_ccr_trap(Register ccr_save);
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 void write_ccr_trap(Register ccr_save1, Register scratch1, Register scratch2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2196
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 // For V8 debugging. Uses V8 instruction sequence and checks
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 // result with V9 insturctions rdccr and wrccr.
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 // Uses Gscatch and Gscatch2
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 void read_ccr_v8_assert(Register ccr_save);
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 void write_ccr_v8_assert(Register ccr_save);
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2204
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 public:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2206
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2207 // Write to card table for - register is destroyed afterwards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2208 void card_table_write(jbyte* byte_map_base, Register tmp, Register obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2209
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2210 void card_write_barrier_post(Register store_addr, Register new_val, Register tmp);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2211
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2212 #ifndef SERIALGC
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2258
diff changeset
2213 // General G1 pre-barrier generator.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2258
diff changeset
2214 void g1_write_barrier_pre(Register obj, Register index, int offset, Register pre_val, Register tmp, bool preserve_o_regs);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2258
diff changeset
2215
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2258
diff changeset
2216 // General G1 post-barrier generator
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2217 void g1_write_barrier_post(Register store_addr, Register new_val, Register tmp);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 124
diff changeset
2218 #endif // SERIALGC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2219
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 // pushes double TOS element of FPU stack on CPU stack; pops from FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 void push_fTOS();
a61af66fc99e Initial load
duke
parents:
diff changeset
2222
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 // pops double TOS element from CPU stack and pushes on FPU stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 void pop_fTOS();
a61af66fc99e Initial load
duke
parents:
diff changeset
2225
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 void empty_FPU_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
2227
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 void push_IU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 void pop_IU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2230
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 void push_FPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 void pop_FPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2233
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 void push_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 void pop_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2236
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2237 // if heap base register is used - reinit it with the correct value
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2238 void reinit_heapbase();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2239
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 void _verify_oop(Register reg, const char * msg, const char * file, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 void _verify_oop_addr(Address addr, const char * msg, const char * file, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 #define verify_oop(reg) _verify_oop(reg, "broken oop " #reg, __FILE__, __LINE__)
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 #define verify_oop_addr(addr) _verify_oop_addr(addr, "broken oop addr ", __FILE__, __LINE__)
a61af66fc99e Initial load
duke
parents:
diff changeset
2246
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 // only if +VerifyOops
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // only if +VerifyFPU
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 void stop(const char* msg); // prints msg, dumps registers and stops execution
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 void warn(const char* msg); // prints msg, but don't stop
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 void untested(const char* what = "");
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1680
diff changeset
2253 void unimplemented(const char* what = "") { char* b = new char[1024]; jio_snprintf(b, 1024, "unimplemented: %s", what); stop(b); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 void should_not_reach_here() { stop("should not reach here"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 void print_CPU_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2256
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 // oops in code
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2258 AddressLiteral allocate_oop_address(jobject obj); // allocate_index
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2259 AddressLiteral constant_oop_address(jobject obj); // find_index
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2260 inline void set_oop (jobject obj, Register d); // uses allocate_oop_address
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2261 inline void set_oop_constant (jobject obj, Register d); // uses constant_oop_address
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 1513
diff changeset
2262 inline void set_oop (const AddressLiteral& obj_addr, Register d); // same as load_address
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2263
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 124
diff changeset
2264 void set_narrow_oop( jobject obj, Register d );
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 124
diff changeset
2265
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 // nop padding
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 void align(int modulus);
a61af66fc99e Initial load
duke
parents:
diff changeset
2268
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 // declare a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 void safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
2271
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 // factor out part of stop into subroutine to save space
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 void stop_subroutine();
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 // factor out part of verify_oop into subroutine to save space
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 void verify_oop_subroutine();
a61af66fc99e Initial load
duke
parents:
diff changeset
2276
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 // side-door communication with signalHandler in os_solaris.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 static address _verify_oop_implicit_branch[3];
a61af66fc99e Initial load
duke
parents:
diff changeset
2279
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 static void test();
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2283
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 // convert an incoming arglist to varargs format; put the pointer in d
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 void set_varargs( Argument a, Register d );
a61af66fc99e Initial load
duke
parents:
diff changeset
2286
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 int total_frame_size_in_bytes(int extraWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
2288
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 // used when extraWords known statically
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 void save_frame(int extraWords);
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 void save_frame_c1(int size_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 // make a frame, and simultaneously pass up one or two register value
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 // into the new register window
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 void save_frame_and_mov(int extraWords, Register s1, Register d1, Register s2 = Register(), Register d2 = Register());
a61af66fc99e Initial load
duke
parents:
diff changeset
2295
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 // give no. (outgoing) params, calc # of words will need on frame
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 void calc_mem_param_words(Register Rparam_words, Register Rresult);
a61af66fc99e Initial load
duke
parents:
diff changeset
2298
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 // used to calculate frame size dynamically
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // result is in bytes and must be negated for save inst
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 void calc_frame_size(Register extraWords, Register resultReg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2302
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 // calc and also save
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 void calc_frame_size_and_save(Register extraWords, Register resultReg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 static void debug(char* msg, RegistersForDebugging* outWindow);
a61af66fc99e Initial load
duke
parents:
diff changeset
2307
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 // implementations of bytecodes used by both interpreter and compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
2309
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 void lcmp( Register Ra_hi, Register Ra_low,
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 Register Rb_hi, Register Rb_low,
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 Register Rresult);
a61af66fc99e Initial load
duke
parents:
diff changeset
2313
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 void lneg( Register Rhi, Register Rlow );
a61af66fc99e Initial load
duke
parents:
diff changeset
2315
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 void lshl( Register Rin_high, Register Rin_low, Register Rcount,
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 Register Rout_high, Register Rout_low, Register Rtemp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2318
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 void lshr( Register Rin_high, Register Rin_low, Register Rcount,
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 Register Rout_high, Register Rout_low, Register Rtemp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2321
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 void lushr( Register Rin_high, Register Rin_low, Register Rcount,
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 Register Rout_high, Register Rout_low, Register Rtemp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2324
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 void lcmp( Register Ra, Register Rb, Register Rresult);
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
2258
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2131
diff changeset
2329 // Load and store values by size and signed-ness
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2131
diff changeset
2330 void load_sized_value( Address src, Register dst, size_t size_in_bytes, bool is_signed);
28bf941f445e 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 2131
diff changeset
2331 void store_sized_value(Register src, Address dst, size_t size_in_bytes);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2332
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 void float_cmp( bool is_float, int unordered_result,
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 FloatRegister Fa, FloatRegister Fb,
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 Register Rresult);
a61af66fc99e Initial load
duke
parents:
diff changeset
2336
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { Assembler::fneg(w, sd); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2341
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 void save_all_globals_into_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 void restore_globals_from_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2344
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 void casx_under_lock(Register top_ptr_reg, Register top_reg, Register ptr_reg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 address lock_addr=0, bool use_call_vm=false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 void cas_under_lock(Register top_ptr_reg, Register top_reg, Register ptr_reg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 address lock_addr=0, bool use_call_vm=false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 void casn (Register addr_reg, Register cmp_reg, Register set_reg) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
2350
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 // These set the icc condition code to equal if the lock succeeded
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 // and notEqual if it failed and requires a slow case
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2353 void compiler_lock_object(Register Roop, Register Rmark, Register Rbox,
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2354 Register Rscratch,
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2355 BiasedLockingCounters* counters = NULL,
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2356 bool try_bias = UseBiasedLocking);
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2357 void compiler_unlock_object(Register Roop, Register Rmark, Register Rbox,
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2358 Register Rscratch,
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 356
diff changeset
2359 bool try_bias = UseBiasedLocking);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2360
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 // Biased locking support
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 // Upon entry, lock_reg must point to the lock record on the stack,
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 // obj_reg must contain the target object, and mark_reg must contain
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 // the target object's header.
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 // Destroys mark_reg if an attempt is made to bias an anonymously
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 // biased lock. In this case a failure will go either to the slow
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 // case or fall through with the notEqual condition code set with
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 // the expectation that the slow case in the runtime will be called.
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 // In the fall-through case where the CAS-based lock is done,
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 // mark_reg is not destroyed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 void biased_locking_enter(Register obj_reg, Register mark_reg, Register temp_reg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 Label& done, Label* slow_case = NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 BiasedLockingCounters* counters = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 // Upon entry, the base register of mark_addr must contain the oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 // Destroys temp_reg.
a61af66fc99e Initial load
duke
parents:
diff changeset
2376
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 // If allow_delay_slot_filling is set to true, the next instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 // emitted after this one will go in an annulled delay slot if the
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 // biased locking exit case failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 void biased_locking_exit(Address mark_addr, Register temp_reg, Label& done, bool allow_delay_slot_filling = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2381
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 // allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 void eden_allocate(
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 Register obj, // result: pointer to object after successful allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 int con_size_in_bytes, // object size in bytes if known at compile time
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 Register t1, // temp register
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 Register t2, // temp register
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 Label& slow_case // continuation point if fast allocation fails
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 void tlab_allocate(
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 Register obj, // result: pointer to object after successful allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 int con_size_in_bytes, // object size in bytes if known at compile time
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 Register t1, // temp register
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 Label& slow_case // continuation point if fast allocation fails
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 void tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case);
2127
5577848f5923 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 2102
diff changeset
2399 void incr_allocated_bytes(RegisterOrConstant size_in_bytes,
5577848f5923 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 2102
diff changeset
2400 Register t1, Register t2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2401
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2402 // interface method calling
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2403 void lookup_interface_method(Register recv_klass,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2404 Register intf_klass,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
2405 RegisterOrConstant itable_index,
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2406 Register method_result,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2407 Register temp_reg, Register temp2_reg,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2408 Label& no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
2409
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2410 // Test sub_klass against super_klass, with fast and slow paths.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2411
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2412 // The fast path produces a tri-state answer: yes / no / maybe-slow.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2413 // One of the three labels can be NULL, meaning take the fall-through.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2414 // If super_check_offset is -1, the value is loaded up from super_klass.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2415 // No registers are killed, except temp_reg and temp2_reg.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2416 // If super_check_offset is not -1, temp2_reg is not used and can be noreg.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2417 void check_klass_subtype_fast_path(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2418 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2419 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2420 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2421 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2422 Label* L_failure,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2423 Label* L_slow_path,
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
2424 RegisterOrConstant super_check_offset = RegisterOrConstant(-1),
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2425 Register instanceof_hack = noreg);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2426
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2427 // The rest of the type check; must be wired to a corresponding fast path.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2428 // It does not repeat the fast path logic, so don't use it standalone.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2429 // The temp_reg can be noreg, if no temps are available.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2430 // It can also be sub_klass or super_klass, meaning it's OK to kill that one.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2431 // Updates the sub's secondary super cache as necessary.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2432 void check_klass_subtype_slow_path(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2433 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2434 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2435 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2436 Register temp3_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2437 Register temp4_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2438 Label* L_success,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2439 Label* L_failure);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2440
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2441 // Simplified, combined version, good for typical uses.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2442 // Falls through on failure.
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2443 void check_klass_subtype(Register sub_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2444 Register super_klass,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2445 Register temp_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2446 Register temp2_reg,
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2447 Label& L_success);
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2448
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2449 // method handles (JSR 292)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2450 void check_method_handle_type(Register mtype_reg, Register mh_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2451 Register temp_reg,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2452 Label& wrong_method_type);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2453 void load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2454 Register temp_reg);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2455 void jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop = true);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2456 // offset relative to Gargs of argument at tos[arg_slot].
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2457 // (arg_slot == 0 means the last argument, not the first).
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2458 RegisterOrConstant argument_offset(RegisterOrConstant arg_slot,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2459 int extra_slot_offset = 0);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2460 // Address of Gargs and argument_offset.
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2461 Address argument_address(RegisterOrConstant arg_slot,
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 1396
diff changeset
2462 int extra_slot_offset = 0);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 623
diff changeset
2463
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 // Stack overflow checking
a61af66fc99e Initial load
duke
parents:
diff changeset
2465
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 // Note: this clobbers G3_scratch
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 void bang_stack_with_offset(int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 // stack grows down, caller passes positive offset
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 assert(offset > 0, "must bang with negative offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 set((-offset)+STACK_BIAS, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 st(G0, SP, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2473
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 // Writes to stack successive pages until offset reached to check for
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 // stack overflow + shadow pages. Clobbers tsp and scratch registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 void bang_stack_size(Register Rsize, Register Rtsp, Register Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2477
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 644
diff changeset
2478 virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 420
diff changeset
2479
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 void verify_tlab();
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 Condition negate_condition(Condition cond);
a61af66fc99e Initial load
duke
parents:
diff changeset
2483
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 // Helper functions for statistics gathering.
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 // Conditionally (non-atomically) increments passed counter address, preserving condition codes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 void cond_inc(Condition cond, address counter_addr, Register Rtemp1, Register Rtemp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 // Unconditional increment.
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2488 void inc_counter(address counter_addr, Register Rtmp1, Register Rtmp2);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 710
diff changeset
2489 void inc_counter(int* counter_addr, Register Rtmp1, Register Rtmp2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2490
986
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 727
diff changeset
2491 // Compare char[] arrays aligned to 4 bytes.
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 727
diff changeset
2492 void char_arrays_equals(Register ary1, Register ary2,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 727
diff changeset
2493 Register limit, Register result,
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 727
diff changeset
2494 Register chr1, Register chr2, Label& Ldone);
62001a362ce9 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 727
diff changeset
2495
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 #undef VIRTUAL
a61af66fc99e Initial load
duke
parents:
diff changeset
2497
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2499
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 * class SkipIfEqual:
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 *
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 * Instantiating this class will result in assembly code being output that will
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 * jump around any code emitted between the creation of the instance and it's
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 * automatic destruction at the end of a scope block, depending on the value of
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 * the flag passed to the constructor, which will be checked at run-time.
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 */
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 class SkipIfEqual : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 MacroAssembler* _masm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 Label _label;
a61af66fc99e Initial load
duke
parents:
diff changeset
2512
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 // 'temp' is a temp register that this object can use (and trash)
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 SkipIfEqual(MacroAssembler*, Register temp,
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 const bool* flag_addr, Assembler::Condition condition);
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 ~SkipIfEqual();
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2519
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 // On RISC, there's no benefit to verifying instruction boundaries.
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 inline bool AbstractAssembler::pd_check_instruction_mark() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1911
diff changeset
2524
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1911
diff changeset
2525 #endif // CPU_SPARC_VM_ASSEMBLER_SPARC_HPP