annotate src/os_cpu/bsd_x86/vm/bsd_x86_32.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) 1999, 2008, 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 // X86 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 output
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 // byte streams. Encoding classes generate functions which are called by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 // Machine Instruction Nodes in order to generate the bit encoding of the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 // instruction. Operands specify their base encoding interface with the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 // interface keyword. There are currently supported four interfaces,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 // REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 // operand to generate a function which returns its register number when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 // queried. CONST_INTER causes an operand to generate a function which
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 // returns the value of the constant when queried. MEMORY_INTER causes an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 // operand to generate four functions which return the Base Register, the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 // Index Register, the Scale Value, and the Offset Value of the operand when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 // queried. COND_INTER causes an operand to generate six functions which
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 // return the encoding code (ie - encoding bits for the instruction)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 // associated with each basic boolean condition for a conditional instruction.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 // Instructions specify two basic values for encoding. They use the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 // ins_encode keyword to specify their encoding class (which must be one of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 // the class names specified in the encoding block), and they use the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 // opcode keyword to specify, in order, their primary, secondary, and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 // tertiary opcode. Only the opcode sections which a particular instruction
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 // needs for encoding need to be specified.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 encode %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 // Build emit functions for each basic byte or larger field in the intel
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 // encoding scheme (opcode, rm, sib, immediate), and call them from C++
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 // code in the enc_class source block. Emit functions will live in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 // main source block for now. In future, we can generalize this by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 // adding a syntax that specifies the sizes of fields in an order,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 // so that the adlc can build the emit functions automagically
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 enc_class bsd_tlsencode (eRegP dst) %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 Register dstReg = as_Register($dst$$reg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 MacroAssembler* masm = new MacroAssembler(&cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 masm->get_thread(dstReg);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 enc_class bsd_breakpoint %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 MacroAssembler* masm = new MacroAssembler(&cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 enc_class call_epilog %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 if( VerifyStackAtCalls ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 // Check that stack depth is unchanged: find majik cookie on stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 int framesize = ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP,-3*VMRegImpl::slots_per_word));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 if(framesize >= 128) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 emit_opcode(cbuf, 0x81); // cmp [esp+0],0xbadb1ood
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 emit_d8(cbuf,0xBC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 emit_d8(cbuf,0x24);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 emit_d32(cbuf,framesize); // Find majik cookie from ESP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 emit_d32(cbuf, 0xbadb100d);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 emit_opcode(cbuf, 0x81); // cmp [esp+0],0xbadb1ood
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 emit_d8(cbuf,0x7C);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 emit_d8(cbuf,0x24);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 emit_d8(cbuf,framesize); // Find majik cookie from ESP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 emit_d32(cbuf, 0xbadb100d);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 // jmp EQ around INT3
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 // QQQ TODO
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 const int jump_around = 5; // size of call to breakpoint, 1 for CC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 emit_opcode(cbuf,0x74);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 emit_d8(cbuf, jump_around);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 // QQQ temporary
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 emit_break(cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 // Die if stack mismatch
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 // emit_opcode(cbuf,0xCC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 // INSTRUCTIONS -- Platform dependent
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 //----------OS and Locking Instructions----------------------------------------
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 // This name is KNOWN by the ADLC and cannot be changed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 // The ADLC forces a 'TypeRawPtr::BOTTOM' output type
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 // for this guy.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 instruct tlsLoadP(eRegP dst, eFlagsReg cr) %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 match(Set dst (ThreadLocal));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 effect(DEF dst, KILL cr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 format %{ "MOV $dst, Thread::current()" %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 ins_encode( bsd_tlsencode(dst) );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 ins_pipe( ialu_reg_fat );
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 instruct TLS(eRegP dst) %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 match(Set dst (ThreadLocal));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118 expand %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119 tlsLoadP(dst);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 // Die now
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 instruct ShouldNotReachHere( )
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 match(Halt);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 // Use the following format syntax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 format %{ "INT3 ; ShouldNotReachHere" %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 // QQQ TODO for now call breakpoint
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 // opcode(0xCC);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 // ins_encode(Opc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133 ins_encode(bsd_breakpoint);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 ins_pipe( pipe_slow );
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 %}
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 // Platform dependent source
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 source %{
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 // emit an interrupt that is caught by the debugger
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 void emit_break(CodeBuffer &cbuf) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 // Debugger doesn't really catch this but best we can do so far QQQ
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147 MacroAssembler* masm = new MacroAssembler(&cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 emit_break(cbuf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 return 5;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 %}