annotate src/os_cpu/bsd_x86/vm/bsd_x86_64.ad @ 4558:3706975946e4

Make graph dumping a bit more robust when there is no method, enable debug in the startCompiler method, add context and scope for snippets installation Made IGV display graphs even if some edges are problematic When schedule failed don't use it
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 10 Feb 2012 02:22:23 +0100
parents f08d439fab8c
children 9b8ce46870df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2 // Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 // This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 // under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 // published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 // This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 // version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 // accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 // You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 // 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 // or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 // questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25 // AMD64 Bsd Architecture Description File
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 //----------OS-DEPENDENT ENCODING BLOCK----------------------------------------
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28 // This block specifies the encoding classes used by the compiler to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 // output byte streams. Encoding classes generate functions which are
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 // called by Machine Instruction Nodes in order to generate the bit
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 // encoding of the instruction. Operands specify their base encoding
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 // interface with the interface keyword. There are currently
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 // supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 // COND_INTER. REG_INTER causes an operand to generate a function
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 // which returns its register number when queried. CONST_INTER causes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 // an operand to generate a function which returns the value of the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 // constant when queried. MEMORY_INTER causes an operand to generate
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 // four functions which return the Base Register, the Index Register,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 // the Scale Value, and the Offset Value of the operand when queried.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 // COND_INTER causes an operand to generate six functions which return
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 // the encoding code (ie - encoding bits for the instruction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 // associated with each basic boolean condition for a conditional
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 // instruction. Instructions specify two basic values for encoding.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 // They use the ins_encode keyword to specify their encoding class
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 // (which must be one of the class names specified in the encoding
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 // block), and they use the opcode keyword to specify, in order, their
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 // primary, secondary, and tertiary opcode. Only the opcode sections
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 // which a particular instruction needs for encoding need to be
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 // specified.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 encode %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 // Build emit functions for each basic byte or larger field in the intel
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 // encoding scheme (opcode, rm, sib, immediate), and call them from C++
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 // code in the enc_class source block. Emit functions will live in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 // main source block for now. In future, we can generalize this by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 // adding a syntax that specifies the sizes of fields in an order,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 // so that the adlc can build the emit functions automagically
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 enc_class Java_To_Runtime(method meth)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 // No relocation needed
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 // movq r10, <meth>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 emit_opcode(cbuf, Assembler::REX_WB);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 emit_opcode(cbuf, 0xB8 | (R10_enc - 8));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 emit_d64(cbuf, (int64_t) $meth$$method);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 // call (r10)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 emit_opcode(cbuf, Assembler::REX_B);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 emit_opcode(cbuf, 0xFF);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 emit_opcode(cbuf, 0xD0 | (R10_enc - 8));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 enc_class bsd_breakpoint
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 MacroAssembler* masm = new MacroAssembler(&cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 enc_class call_epilog
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 if (VerifyStackAtCalls) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 // Check that stack depth is unchanged: find majik cookie on stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 int framesize =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3*VMRegImpl::slots_per_word));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 if (framesize) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 if (framesize < 0x80) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 emit_opcode(cbuf, Assembler::REX_W);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 emit_d8(cbuf, 0x7C);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 emit_d8(cbuf, 0x24);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 emit_d8(cbuf, framesize); // Find majik cookie from ESP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 emit_d32(cbuf, 0xbadb100d);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 emit_opcode(cbuf, Assembler::REX_W);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96 emit_d8(cbuf, 0xBC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 emit_d8(cbuf, 0x24);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 emit_d32(cbuf, framesize); // Find majik cookie from ESP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 emit_d32(cbuf, 0xbadb100d);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102 // jmp EQ around INT3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 // QQQ TODO
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 const int jump_around = 5; // size of call to breakpoint, 1 for CC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 emit_opcode(cbuf, 0x74);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 emit_d8(cbuf, jump_around);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 // QQQ temporary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 emit_break(cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109 // Die if stack mismatch
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 // emit_opcode(cbuf,0xCC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
114 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 // INSTRUCTIONS -- Platform dependent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118 //----------OS and Locking Instructions----------------------------------------
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 // This name is KNOWN by the ADLC and cannot be changed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 // The ADLC forces a 'TypeRawPtr::BOTTOM' output type
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 // for this guy.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 instruct tlsLoadP(r15_RegP dst)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 match(Set dst (ThreadLocal));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 effect(DEF dst);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 size(0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 format %{ "# TLS is in R15" %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 ins_encode( /*empty encoding*/ );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 ins_pipe(ialu_reg_reg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 // Die now
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 instruct ShouldNotReachHere()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137 match(Halt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 // Use the following format syntax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140 format %{ "int3\t# ShouldNotReachHere" %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 // QQQ TODO for now call breakpoint
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 // opcode(0xCC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 // ins_encode(Opc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 ins_encode(bsd_breakpoint);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145 ins_pipe(pipe_slow);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 // Platform dependent source
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 source
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154 int MachCallRuntimeNode::ret_addr_offset() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155 return 13; // movq r10,#addr; callq (r10)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 // emit an interrupt that is caught by the debugger
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 void emit_break(CodeBuffer& cbuf) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 // Debugger doesn't really catch this but best we can do so far QQQ
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 MacroAssembler* masm = new MacroAssembler(&cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 void MachBreakpointNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 emit_break(cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 uint MachBreakpointNode::size(PhaseRegAlloc* ra_) const {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170 return 5;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 %}