annotate src/os_cpu/linux_x86/vm/linux_x86_64.ad @ 4710:41406797186b

7113012: G1: rename not-fully-young GCs as "mixed" Summary: Renamed partially-young GCs as mixed and fully-young GCs as young. Change all external output that includes those terms (GC log and GC ergo log) as well as any comments, fields, methods, etc. The changeset also includes very minor code tidying up (added some curly brackets). Reviewed-by: johnc, brutisso
author tonyp
date Fri, 16 Dec 2011 02:14:27 -0500
parents 95134e034042
children 9b8ce46870df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 //
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
2 // Copyright (c) 2003, 2006, 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: 0
diff changeset
19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
diff changeset
21 // questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 //
a61af66fc99e Initial load
duke
parents:
diff changeset
23 //
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // AMD64 Linux Architecture Description File
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 //----------OS-DEPENDENT ENCODING BLOCK----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // This block specifies the encoding classes used by the compiler to
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // output byte streams. Encoding classes generate functions which are
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // called by Machine Instruction Nodes in order to generate the bit
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // encoding of the instruction. Operands specify their base encoding
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // interface with the interface keyword. There are currently
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // COND_INTER. REG_INTER causes an operand to generate a function
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // which returns its register number when queried. CONST_INTER causes
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // an operand to generate a function which returns the value of the
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // constant when queried. MEMORY_INTER causes an operand to generate
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // four functions which return the Base Register, the Index Register,
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // the Scale Value, and the Offset Value of the operand when queried.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // COND_INTER causes an operand to generate six functions which return
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // the encoding code (ie - encoding bits for the instruction)
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // associated with each basic boolean condition for a conditional
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // instruction. Instructions specify two basic values for encoding.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // They use the ins_encode keyword to specify their encoding class
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // (which must be one of the class names specified in the encoding
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // block), and they use the opcode keyword to specify, in order, their
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // primary, secondary, and tertiary opcode. Only the opcode sections
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // which a particular instruction needs for encoding need to be
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // specified.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 encode %{
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Build emit functions for each basic byte or larger field in the intel
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // encoding scheme (opcode, rm, sib, immediate), and call them from C++
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // code in the enc_class source block. Emit functions will live in the
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // main source block for now. In future, we can generalize this by
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // adding a syntax that specifies the sizes of fields in an order,
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // so that the adlc can build the emit functions automagically
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 enc_class Java_To_Runtime(method meth)
a61af66fc99e Initial load
duke
parents:
diff changeset
59 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // No relocation needed
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // movq r10, <meth>
a61af66fc99e Initial load
duke
parents:
diff changeset
63 emit_opcode(cbuf, Assembler::REX_WB);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 emit_opcode(cbuf, 0xB8 | (R10_enc - 8));
a61af66fc99e Initial load
duke
parents:
diff changeset
65 emit_d64(cbuf, (int64_t) $meth$$method);
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // call (r10)
a61af66fc99e Initial load
duke
parents:
diff changeset
68 emit_opcode(cbuf, Assembler::REX_B);
a61af66fc99e Initial load
duke
parents:
diff changeset
69 emit_opcode(cbuf, 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 emit_opcode(cbuf, 0xD0 | (R10_enc - 8));
a61af66fc99e Initial load
duke
parents:
diff changeset
71 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 enc_class linux_breakpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
74 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
75 MacroAssembler* masm = new MacroAssembler(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
a61af66fc99e Initial load
duke
parents:
diff changeset
77 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 enc_class call_epilog
a61af66fc99e Initial load
duke
parents:
diff changeset
80 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if (VerifyStackAtCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Check that stack depth is unchanged: find majik cookie on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
83 int framesize =
a61af66fc99e Initial load
duke
parents:
diff changeset
84 ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3*VMRegImpl::slots_per_word));
a61af66fc99e Initial load
duke
parents:
diff changeset
85 if (framesize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 if (framesize < 0x80) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 emit_opcode(cbuf, Assembler::REX_W);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
a61af66fc99e Initial load
duke
parents:
diff changeset
89 emit_d8(cbuf, 0x7C);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 emit_d8(cbuf, 0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 emit_d8(cbuf, framesize); // Find majik cookie from ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
92 emit_d32(cbuf, 0xbadb100d);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 emit_opcode(cbuf, Assembler::REX_W);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
a61af66fc99e Initial load
duke
parents:
diff changeset
96 emit_d8(cbuf, 0xBC);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 emit_d8(cbuf, 0x24);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 emit_d32(cbuf, framesize); // Find majik cookie from ESP
a61af66fc99e Initial load
duke
parents:
diff changeset
99 emit_d32(cbuf, 0xbadb100d);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // jmp EQ around INT3
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // QQQ TODO
a61af66fc99e Initial load
duke
parents:
diff changeset
104 const int jump_around = 5; // size of call to breakpoint, 1 for CC
a61af66fc99e Initial load
duke
parents:
diff changeset
105 emit_opcode(cbuf, 0x74);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 emit_d8(cbuf, jump_around);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // QQQ temporary
a61af66fc99e Initial load
duke
parents:
diff changeset
108 emit_break(cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Die if stack mismatch
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // emit_opcode(cbuf,0xCC);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // INSTRUCTIONS -- Platform dependent
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 //----------OS and Locking Instructions----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // This name is KNOWN by the ADLC and cannot be changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // The ADLC forces a 'TypeRawPtr::BOTTOM' output type
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // for this guy.
a61af66fc99e Initial load
duke
parents:
diff changeset
123 instruct tlsLoadP(r15_RegP dst)
a61af66fc99e Initial load
duke
parents:
diff changeset
124 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
125 match(Set dst (ThreadLocal));
a61af66fc99e Initial load
duke
parents:
diff changeset
126 effect(DEF dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 size(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 format %{ "# TLS is in R15" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
130 ins_encode( /*empty encoding*/ );
a61af66fc99e Initial load
duke
parents:
diff changeset
131 ins_pipe(ialu_reg_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Die now
a61af66fc99e Initial load
duke
parents:
diff changeset
135 instruct ShouldNotReachHere()
a61af66fc99e Initial load
duke
parents:
diff changeset
136 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
137 match(Halt);
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Use the following format syntax
a61af66fc99e Initial load
duke
parents:
diff changeset
140 format %{ "int3\t# ShouldNotReachHere" %}
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // QQQ TODO for now call breakpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // opcode(0xCC);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // ins_encode(Opc);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 ins_encode(linux_breakpoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 ins_pipe(pipe_slow);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 %}
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Platform dependent source
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 source
a61af66fc99e Initial load
duke
parents:
diff changeset
152 %{
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 int MachCallRuntimeNode::ret_addr_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 return 13; // movq r10,#addr; callq (r10)
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // emit an interrupt that is caught by the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void emit_break(CodeBuffer& cbuf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Debugger doesn't really catch this but best we can do so far QQQ
a61af66fc99e Initial load
duke
parents:
diff changeset
161 MacroAssembler* masm = new MacroAssembler(&cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 void MachBreakpointNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 emit_break(cbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 uint MachBreakpointNode::size(PhaseRegAlloc* ra_) const {
3851
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 1552
diff changeset
170 // distance could be far and requires load and call through register
95134e034042 7063629: use cbcond in C2 generated code on T4
kvn
parents: 1552
diff changeset
171 return MachNode::size(ra_);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 %}