Mercurial > hg > truffle
annotate graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotSafepointOp.java @ 14031:390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
author | twisti |
---|---|
date | Thu, 27 Feb 2014 11:33:17 -0800 |
parents | 28f560605e77 |
children | 6bab029d6e3a |
rev | line source |
---|---|
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
1 /* |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
4 * |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
8 * |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
14 * |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
18 * |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
21 * questions. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
22 */ |
6495
75f130f2b30f
moved AMD64 specific HotSpot code in com.oracle.graal.hotspot.amd64 project
Doug Simon <doug.simon@oracle.com>
parents:
6493
diff
changeset
|
23 package com.oracle.graal.hotspot.amd64; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
24 |
6580
d56d600819fe
moved AMD64 into its own (new) project: com.oracle.graal.amd64
Doug Simon <doug.simon@oracle.com>
parents:
6531
diff
changeset
|
25 import static com.oracle.graal.amd64.AMD64.*; |
13476
e6309fde98c8
exposed ForceUnreachable to Graal and used it when emitting safepoint polling code
Doug Simon <doug.simon@oracle.com>
parents:
13352
diff
changeset
|
26 import static com.oracle.graal.asm.NumUtil.*; |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
27 import static com.oracle.graal.hotspot.bridge.Marks.*; |
13513
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
28 import static com.oracle.graal.phases.GraalOptions.*; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
29 |
5510
426c605c9d3c
Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5236
diff
changeset
|
30 import com.oracle.graal.api.code.*; |
9294
899295127bc4
Get rid of the distinction between UNUSED and ILLEGAL value.
Roland Schatz <roland.schatz@oracle.com>
parents:
9003
diff
changeset
|
31 import com.oracle.graal.api.meta.*; |
6531
4afe23aa0a00
renamed packages: com.oracle.max.asm... -> com.oracle.graal.asm...
Doug Simon <doug.simon@oracle.com>
parents:
6495
diff
changeset
|
32 import com.oracle.graal.asm.amd64.*; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
33 import com.oracle.graal.hotspot.*; |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
34 import com.oracle.graal.lir.*; |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
35 import com.oracle.graal.lir.amd64.*; |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
36 import com.oracle.graal.lir.asm.*; |
7938
24e93ac47e95
Allocate temporary register for safepoint operation instead of using scratch register.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7841
diff
changeset
|
37 import com.oracle.graal.nodes.spi.*; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
38 |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
39 /** |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
40 * Emits a safepoint poll. |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
41 */ |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5548
diff
changeset
|
42 @Opcode("SAFEPOINT") |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
43 public class AMD64HotSpotSafepointOp extends AMD64LIRInstruction { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7154
diff
changeset
|
44 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5548
diff
changeset
|
45 @State protected LIRFrameState state; |
13352
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
46 @Temp({OperandFlag.REG, OperandFlag.ILLEGAL}) private AllocatableValue temp; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
47 |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
48 private final HotSpotVMConfig config; |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
49 |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
50 public AMD64HotSpotSafepointOp(LIRFrameState state, HotSpotVMConfig config, LIRGeneratorTool tool) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5548
diff
changeset
|
51 this.state = state; |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
52 this.config = config; |
13513
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
53 if (isPollingPageFar(config) || ImmutableCode.getValue()) { |
13352
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
54 temp = tool.newVariable(tool.target().wordKind); |
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
55 } else { |
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
56 // Don't waste a register if it's unneeded |
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
57 temp = Value.ILLEGAL; |
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
58 } |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
59 } |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
60 |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
61 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
62 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler asm) { |
13352
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
63 emitCode(crb, asm, config, false, state, temp instanceof RegisterValue ? ((RegisterValue) temp).getRegister() : null); |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
64 } |
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
65 |
12559
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
66 /** |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
67 * Tests if the polling page address can be reached from the code cache with 32-bit |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
68 * displacements. |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
69 */ |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
70 private static boolean isPollingPageFar(HotSpotVMConfig config) { |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
71 final long pollingPageAddress = config.safepointPollingAddress; |
13476
e6309fde98c8
exposed ForceUnreachable to Graal and used it when emitting safepoint polling code
Doug Simon <doug.simon@oracle.com>
parents:
13352
diff
changeset
|
72 return config.forceUnreachable || !isInt(pollingPageAddress - config.codeCacheLowBoundary()) || !isInt(pollingPageAddress - config.codeCacheHighBoundary()); |
12559
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
73 } |
ae412befde21
read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
twisti
parents:
11760
diff
changeset
|
74 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
75 public static void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler asm, HotSpotVMConfig config, boolean atReturn, LIRFrameState state, Register scratch) { |
13972
28f560605e77
safepoint poll at return can never be elided
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13576
diff
changeset
|
76 assert !atReturn || state == null : "state is unneeded at return"; |
13513
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
77 if (ImmutableCode.getValue()) { |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
78 Kind hostWordKind = HotSpotGraalRuntime.getHostWordKind(); |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
79 int alignment = hostWordKind.getBitCount() / Byte.SIZE; |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
80 Constant pollingPageAddress = Constant.forIntegerKind(hostWordKind, config.safepointPollingAddress, null); |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
81 // This move will be patched to load the safepoint page from a data segment |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
82 // co-located with the immutable code. |
13576
4e679d50ba9a
Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents:
13513
diff
changeset
|
83 asm.movq(scratch, (AMD64Address) crb.recordDataReferenceInCode(pollingPageAddress, alignment)); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13972
diff
changeset
|
84 final int pos = asm.position(); |
13513
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
85 crb.recordMark(atReturn ? MARK_POLL_RETURN_FAR : MARK_POLL_FAR); |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
86 if (state != null) { |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
87 crb.recordInfopoint(pos, state, InfopointReason.SAFEPOINT); |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
88 } |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
89 asm.testl(rax, new AMD64Address(scratch)); |
64a23ce736a0
added support for ImmutabelCode safepoints (GRAAL-283)
Doug Simon <doug.simon@oracle.com>
parents:
13477
diff
changeset
|
90 } else if (isPollingPageFar(config)) { |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
91 asm.movq(scratch, config.safepointPollingAddress); |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
92 crb.recordMark(atReturn ? MARK_POLL_RETURN_FAR : MARK_POLL_FAR); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13972
diff
changeset
|
93 final int pos = asm.position(); |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
94 if (state != null) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
95 crb.recordInfopoint(pos, state, InfopointReason.SAFEPOINT); |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
96 } |
13352
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
97 asm.testl(rax, new AMD64Address(scratch)); |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
98 } else { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
99 crb.recordMark(atReturn ? MARK_POLL_RETURN_NEAR : MARK_POLL_NEAR); |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13972
diff
changeset
|
100 final int pos = asm.position(); |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
101 if (state != null) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
12559
diff
changeset
|
102 crb.recordInfopoint(pos, state, InfopointReason.SAFEPOINT); |
11760
ce0b00597980
made safepoint-on-return use specialized HotSpot runtime support for such safepoints (which have no debug info attached)
Doug Simon <doug.simon@oracle.com>
parents:
10913
diff
changeset
|
103 } |
7154
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
104 // The C++ code transforms the polling page offset into an RIP displacement |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
105 // to the real address at that offset in the polling page. |
13352
cd22c6bb4a35
use test instead of mov for poll
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13227
diff
changeset
|
106 asm.testl(rax, new AMD64Address(rip, 0)); |
5236
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
107 } |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
108 } |
f9aae727d035
removed XIR safepoint operation
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
109 } |