Mercurial > hg > truffle
annotate graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java @ 14747:a836fed0e270
Merge
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Tue, 25 Mar 2014 13:50:28 -0700 |
parents | c4903a8f6ef4 c5ee41cf9823 |
children | 96f8e6b6a81a |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
8144
a016a19f3792
Remove SpillMoveOp.
Roland Schatz <roland.schatz@oracle.com>
parents:
8136
diff
changeset
|
2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
23 package com.oracle.graal.lir.amd64; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5539
diff
changeset
|
25 import static com.oracle.graal.api.code.ValueUtil.*; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
26 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
27 import static java.lang.Double.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
28 import static java.lang.Float.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
29 |
6580
d56d600819fe
moved AMD64 into its own (new) project: com.oracle.graal.amd64
Doug Simon <doug.simon@oracle.com>
parents:
6539
diff
changeset
|
30 import com.oracle.graal.amd64.*; |
7882
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
31 import com.oracle.graal.api.code.*; |
14730
209cf6959421
added support for installing raw data with code
Doug Simon <doug.simon@oracle.com>
parents:
14121
diff
changeset
|
32 import com.oracle.graal.api.code.CompilationResult.RawData; |
5507
dc71b06d09f8
Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5506
diff
changeset
|
33 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:
6493
diff
changeset
|
34 import com.oracle.graal.asm.*; |
4afe23aa0a00
renamed packages: com.oracle.max.asm... -> com.oracle.graal.asm...
Doug Simon <doug.simon@oracle.com>
parents:
6493
diff
changeset
|
35 import com.oracle.graal.asm.amd64.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
36 import com.oracle.graal.graph.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
37 import com.oracle.graal.lir.*; |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
38 import com.oracle.graal.lir.StandardOp.ImplicitNullCheck; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
39 import com.oracle.graal.lir.StandardOp.MoveOp; |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
40 import com.oracle.graal.lir.StandardOp.NullCheck; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
41 import com.oracle.graal.lir.asm.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
42 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
43 public class AMD64Move { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
44 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
45 @Opcode("MOVE") |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
46 public static class MoveToRegOp extends AMD64LIRInstruction implements MoveOp { |
7881 | 47 |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
48 @Def({REG, HINT}) protected AllocatableValue result; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
49 @Use({REG, STACK, CONST}) protected Value input; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
50 |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
51 public MoveToRegOp(AllocatableValue result, Value input) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
52 this.result = result; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
53 this.input = input; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
54 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
55 |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
56 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
57 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
58 move(crb, masm, getResult(), getInput()); |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
59 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
60 |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
61 @Override |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5538
diff
changeset
|
62 public Value getInput() { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
63 return input; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
64 } |
7881 | 65 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
66 @Override |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
67 public AllocatableValue getResult() { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
68 return result; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
69 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
70 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
71 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
72 @Opcode("MOVE") |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
73 public static class MoveFromRegOp extends AMD64LIRInstruction implements MoveOp { |
7881 | 74 |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
75 @Def({REG, STACK}) protected AllocatableValue result; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
76 @Use({REG, CONST, HINT}) protected Value input; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
77 |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
78 public MoveFromRegOp(AllocatableValue result, Value input) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
79 this.result = result; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
80 this.input = input; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
81 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
82 |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
83 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
84 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
85 move(crb, masm, getResult(), getInput()); |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
86 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
87 |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
88 @Override |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5538
diff
changeset
|
89 public Value getInput() { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
90 return input; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
91 } |
7881 | 92 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
93 @Override |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
9293
diff
changeset
|
94 public AllocatableValue getResult() { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
95 return result; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
96 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
97 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
98 |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
99 public abstract static class MemOp extends AMD64LIRInstruction implements ImplicitNullCheck { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
100 |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
101 protected final Kind kind; |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
102 @Use({COMPOSITE}) protected AMD64AddressValue address; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
103 @State protected LIRFrameState state; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
104 |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
105 public MemOp(Kind kind, AMD64AddressValue address, LIRFrameState state) { |
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
106 this.kind = kind; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
107 this.address = address; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
108 this.state = state; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
109 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
110 |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
111 protected abstract void emitMemAccess(CompilationResultBuilder crb, AMD64MacroAssembler masm); |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
112 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
113 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
114 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
115 if (state != null) { |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13931
diff
changeset
|
116 crb.recordImplicitException(masm.position(), state); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
117 } |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
118 emitMemAccess(crb, masm); |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
119 } |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
120 |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
121 public boolean makeNullCheckFor(Value value, LIRFrameState nullCheckState, int implicitNullCheckLimit) { |
13111
caeacd31800a
replaced == with equals as pointed out by VerifyUsageWithEquals
twisti
parents:
12785
diff
changeset
|
122 if (state == null && value.equals(address.base) && address.index.equals(Value.ILLEGAL) && address.displacement >= 0 && address.displacement < implicitNullCheckLimit) { |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
123 state = nullCheckState; |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
124 return true; |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
125 } |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
126 return false; |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
127 } |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
128 } |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
129 |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
130 public static class LoadOp extends MemOp { |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
131 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
132 @Def({REG}) protected AllocatableValue result; |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
133 |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
134 public LoadOp(Kind kind, AllocatableValue result, AMD64AddressValue address, LIRFrameState state) { |
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
135 super(kind, address, state); |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
136 this.result = result; |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
137 } |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
138 |
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
139 @Override |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
140 public void emitMemAccess(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
141 switch (kind) { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
142 case Boolean: |
13931
ce73694346b2
minor assembly tweaks
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13587
diff
changeset
|
143 masm.movzbl(asRegister(result), address.toAddress()); |
ce73694346b2
minor assembly tweaks
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13587
diff
changeset
|
144 break; |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
145 case Byte: |
13587
40e81cba9e08
renamed movzx/movsx instructions; removed duplicate movswl; added movzbl
twisti
parents:
13576
diff
changeset
|
146 masm.movsbl(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
147 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
148 case Char: |
13587
40e81cba9e08
renamed movzx/movsx instructions; removed duplicate movswl; added movzbl
twisti
parents:
13576
diff
changeset
|
149 masm.movzwl(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
150 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
151 case Short: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
152 masm.movswl(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
153 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
154 case Int: |
12766
0b7172f093d0
don't sign extend integer laods
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
11959
diff
changeset
|
155 masm.movl(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
156 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
157 case Long: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
158 masm.movq(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
159 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
160 case Float: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
161 masm.movflt(asFloatReg(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
162 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
163 case Double: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
164 masm.movdbl(asDoubleReg(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
165 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
166 case Object: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
167 masm.movq(asRegister(result), address.toAddress()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
168 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
169 default: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
170 throw GraalInternalError.shouldNotReachHere(); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
171 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
172 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
173 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
174 |
14737
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
175 public static class ZeroExtendLoadOp extends MemOp { |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
176 |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
177 @Def({REG}) protected AllocatableValue result; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
178 |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
179 public ZeroExtendLoadOp(Kind kind, AllocatableValue result, AMD64AddressValue address, LIRFrameState state) { |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
180 super(kind, address, state); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
181 this.result = result; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
182 } |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
183 |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
184 @Override |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
185 public void emitMemAccess(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
186 switch (kind) { |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
187 case Boolean: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
188 case Byte: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
189 masm.movzbl(asRegister(result), address.toAddress()); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
190 break; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
191 case Char: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
192 case Short: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
193 masm.movzwl(asRegister(result), address.toAddress()); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
194 break; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
195 case Int: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
196 masm.movl(asRegister(result), address.toAddress()); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
197 break; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
198 case Long: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
199 masm.movq(asRegister(result), address.toAddress()); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
200 break; |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
201 default: |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
202 throw GraalInternalError.shouldNotReachHere(); |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
203 } |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
204 } |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
205 } |
c4903a8f6ef4
Support zero-extend-load for all data sizes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
14730
diff
changeset
|
206 |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
207 public static class StoreOp extends MemOp { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
208 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
209 @Use({REG}) protected AllocatableValue input; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
210 |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
211 public StoreOp(Kind kind, AMD64AddressValue address, AllocatableValue input, LIRFrameState state) { |
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
212 super(kind, address, state); |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
213 this.input = input; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
214 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
215 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
216 @Override |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
217 public void emitMemAccess(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
218 assert isRegister(input); |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
219 switch (kind) { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
220 case Boolean: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
221 case Byte: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
222 masm.movb(address.toAddress(), asRegister(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
223 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
224 case Char: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
225 case Short: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
226 masm.movw(address.toAddress(), asRegister(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
227 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
228 case Int: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
229 masm.movl(address.toAddress(), asRegister(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
230 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
231 case Long: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
232 masm.movq(address.toAddress(), asRegister(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
233 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
234 case Float: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
235 masm.movflt(address.toAddress(), asFloatReg(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
236 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
237 case Double: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
238 masm.movsd(address.toAddress(), asDoubleReg(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
239 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
240 case Object: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
241 masm.movq(address.toAddress(), asRegister(input)); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
242 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
243 default: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
244 throw GraalInternalError.shouldNotReachHere(); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
245 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
246 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
247 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
248 |
7905
38a597987357
Common base class for Load and Store.
Roland Schatz <roland.schatz@oracle.com>
parents:
7884
diff
changeset
|
249 public static class StoreConstantOp extends MemOp { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
250 |
8136
c66aa27ef4da
Reenable patching of optimized and static calls but without out-of-line stubs.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7908
diff
changeset
|
251 protected final Constant input; |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
252 |
11474
df18a4214c7c
Move compressed pointers' logic to HotSpot specific move
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
11452
diff
changeset
|
253 public StoreConstantOp(Kind kind, AMD64AddressValue address, Constant input, LIRFrameState state) { |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
254 super(kind, address, state); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
255 this.input = input; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
256 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
257 |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
258 @Override |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
259 public void emitMemAccess(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
9293
d006c9920e94
Make kind of LIR memory access operations explicit.
Roland Schatz <roland.schatz@oracle.com>
parents:
8390
diff
changeset
|
260 switch (kind) { |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
261 case Boolean: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
262 case Byte: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
263 masm.movb(address.toAddress(), input.asInt() & 0xFF); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
264 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
265 case Char: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
266 case Short: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
267 masm.movw(address.toAddress(), input.asInt() & 0xFFFF); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
268 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
269 case Int: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
270 masm.movl(address.toAddress(), input.asInt()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
271 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
272 case Long: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
273 if (NumUtil.isInt(input.asLong())) { |
11474
df18a4214c7c
Move compressed pointers' logic to HotSpot specific move
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
11452
diff
changeset
|
274 masm.movslq(address.toAddress(), (int) input.asLong()); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
275 } else { |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
276 throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
277 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
278 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
279 case Float: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
280 masm.movl(address.toAddress(), floatToRawIntBits(input.asFloat())); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
281 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
282 case Double: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
283 throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
284 case Object: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
285 if (input.isNull()) { |
11474
df18a4214c7c
Move compressed pointers' logic to HotSpot specific move
Christos Kotselidis <christos.kotselidis@oracle.com>
parents:
11452
diff
changeset
|
286 masm.movptr(address.toAddress(), 0); |
7884
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
287 } else { |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
288 throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
289 } |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
290 break; |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
291 default: |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
292 throw GraalInternalError.shouldNotReachHere(); |
14b52a260099
Separate store op for storing constants.
Roland Schatz <roland.schatz@oracle.com>
parents:
7882
diff
changeset
|
293 } |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
294 } |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
295 } |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
296 |
7881 | 297 public static class LeaOp extends AMD64LIRInstruction { |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
298 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
299 @Def({REG}) protected AllocatableValue result; |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
300 @Use({COMPOSITE, UNINITIALIZED}) protected AMD64AddressValue address; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
301 |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
302 public LeaOp(AllocatableValue result, AMD64AddressValue address) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
303 this.result = result; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
304 this.address = address; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
305 } |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
306 |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
307 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
308 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
309 masm.leaq(asLongReg(result), address.toAddress()); |
7882
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
310 } |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
311 } |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
312 |
14735
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
313 public static class LeaDataOp extends AMD64LIRInstruction { |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
314 |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
315 @Def({REG}) protected AllocatableValue result; |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
316 private final byte[] data; |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
317 |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
318 public LeaDataOp(AllocatableValue result, byte[] data) { |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
319 this.result = result; |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
320 this.data = data; |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
321 } |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
322 |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
323 @Override |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
324 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
325 RawData rawData = new RawData(data, 16); |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
326 masm.leaq(asRegister(result), (AMD64Address) crb.recordDataReferenceInCode(rawData)); |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
327 } |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
328 } |
c5ee41cf9823
replaced RawDataValue with LIRGeneratorTool.emitData(); accept only ASCII strings in log and VM error messages
Doug Simon <doug.simon@oracle.com>
parents:
14730
diff
changeset
|
329 |
7882
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
330 public static class StackLeaOp extends AMD64LIRInstruction { |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
331 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
332 @Def({REG}) protected AllocatableValue result; |
7882
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
333 @Use({STACK, UNINITIALIZED}) protected StackSlot slot; |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
334 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
335 public StackLeaOp(AllocatableValue result, StackSlot slot) { |
7882
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
336 this.result = result; |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
337 this.slot = slot; |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
338 } |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
339 |
124b28240347
Separate STACK and ADDR nodes in LIR.
Roland Schatz <roland.schatz@oracle.com>
parents:
7881
diff
changeset
|
340 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
341 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
342 masm.leaq(asLongReg(result), (AMD64Address) crb.asAddress(slot)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
343 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
344 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
345 |
7881 | 346 public static class MembarOp extends AMD64LIRInstruction { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
347 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
348 private final int barriers; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
349 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
350 public MembarOp(final int barriers) { |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
351 this.barriers = barriers; |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
352 } |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4231
diff
changeset
|
353 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
354 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
355 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
356 masm.membar(barriers); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
357 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
358 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
359 |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
360 public static class NullCheckOp extends AMD64LIRInstruction implements NullCheck { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
361 |
8390
acc24060b64f
Use implicit null checks for all null checks
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8166
diff
changeset
|
362 @Use({REG}) protected AllocatableValue input; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
363 @State protected LIRFrameState state; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
364 |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
365 public NullCheckOp(Variable input, LIRFrameState state) { |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
366 this.input = input; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
367 this.state = state; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
368 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
369 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
370 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
371 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
14031
390c4b742890
made com.oracle.graal.asm.Buffer non-public and a private field in AbstractAssembler
twisti
parents:
13931
diff
changeset
|
372 crb.recordImplicitException(masm.position(), state); |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
373 masm.nullCheck(asRegister(input)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
374 } |
12785
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
375 |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
376 public Value getCheckedValue() { |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
377 return input; |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
378 } |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
379 |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
380 public LIRFrameState getState() { |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
381 return state; |
c13633a4d472
peephole optimization to remove null checks at the LIR level
Lukas Stadler <lukas.stadler@jku.at>
parents:
12766
diff
changeset
|
382 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
383 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
384 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
385 @Opcode("CAS") |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
386 public static class CompareAndSwapOp extends AMD64LIRInstruction { |
7881 | 387 |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
388 @Def protected AllocatableValue result; |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
389 @Use({COMPOSITE}) protected AMD64AddressValue address; |
7908
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
390 @Use protected AllocatableValue cmpValue; |
775745294caa
Change Value to AllocatableValue in move operations.
Roland Schatz <roland.schatz@oracle.com>
parents:
7905
diff
changeset
|
391 @Use protected AllocatableValue newValue; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
392 |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
393 public CompareAndSwapOp(AllocatableValue result, AMD64AddressValue address, AllocatableValue cmpValue, AllocatableValue newValue) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
394 this.result = result; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
395 this.address = address; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
396 this.cmpValue = cmpValue; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5547
diff
changeset
|
397 this.newValue = newValue; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
398 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
399 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4314
diff
changeset
|
400 @Override |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
401 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
402 compareAndSwap(crb, masm, result, address, cmpValue, newValue); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
403 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
404 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
405 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
406 public static void move(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Value input) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
407 if (isRegister(input)) { |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
408 if (isRegister(result)) { |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
409 reg2reg(masm, result, input); |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
410 } else if (isStackSlot(result)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
411 reg2stack(crb, masm, result, input); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
412 } else { |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
413 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
414 } |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
415 } else if (isStackSlot(input)) { |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
416 if (isRegister(result)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
417 stack2reg(crb, masm, result, input); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
418 } else { |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
419 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
420 } |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
421 } else if (isConstant(input)) { |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
422 if (isRegister(result)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
423 const2reg(crb, masm, result, (Constant) input); |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
424 } else if (isStackSlot(result)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
425 const2stack(crb, masm, result, (Constant) input); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
426 } else { |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
427 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
428 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
429 } else { |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
430 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
431 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
432 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
433 |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5538
diff
changeset
|
434 private static void reg2reg(AMD64MacroAssembler masm, Value result, Value input) { |
6474
f2624e472426
ignore kinds when checking for redundant register to register move
Doug Simon <doug.simon@oracle.com>
parents:
6329
diff
changeset
|
435 if (asRegister(input).equals(asRegister(result))) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
436 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
437 } |
6329
92bc58dc5b5e
More clean up and documentation in api.code and api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5733
diff
changeset
|
438 switch (input.getKind()) { |
7881 | 439 case Int: |
440 masm.movl(asRegister(result), asRegister(input)); | |
441 break; | |
442 case Long: | |
443 masm.movq(asRegister(result), asRegister(input)); | |
444 break; | |
445 case Float: | |
446 masm.movflt(asFloatReg(result), asFloatReg(input)); | |
447 break; | |
448 case Double: | |
449 masm.movdbl(asDoubleReg(result), asDoubleReg(input)); | |
450 break; | |
451 case Object: | |
452 masm.movq(asRegister(result), asRegister(input)); | |
453 break; | |
454 default: | |
455 throw GraalInternalError.shouldNotReachHere("kind=" + result.getKind()); | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
456 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
457 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
458 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
459 private static void reg2stack(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Value input) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
460 AMD64Address dest = (AMD64Address) crb.asAddress(result); |
6329
92bc58dc5b5e
More clean up and documentation in api.code and api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5733
diff
changeset
|
461 switch (input.getKind()) { |
7881 | 462 case Int: |
463 masm.movl(dest, asRegister(input)); | |
464 break; | |
465 case Long: | |
466 masm.movq(dest, asRegister(input)); | |
467 break; | |
468 case Float: | |
469 masm.movflt(dest, asFloatReg(input)); | |
470 break; | |
471 case Double: | |
472 masm.movsd(dest, asDoubleReg(input)); | |
473 break; | |
474 case Object: | |
475 masm.movq(dest, asRegister(input)); | |
476 break; | |
477 default: | |
478 throw GraalInternalError.shouldNotReachHere(); | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
479 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
480 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
481 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
482 private static void stack2reg(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Value input) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
483 AMD64Address src = (AMD64Address) crb.asAddress(input); |
6329
92bc58dc5b5e
More clean up and documentation in api.code and api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5733
diff
changeset
|
484 switch (input.getKind()) { |
7881 | 485 case Int: |
486 masm.movl(asRegister(result), src); | |
487 break; | |
488 case Long: | |
489 masm.movq(asRegister(result), src); | |
490 break; | |
491 case Float: | |
492 masm.movflt(asFloatReg(result), src); | |
493 break; | |
494 case Double: | |
495 masm.movdbl(asDoubleReg(result), src); | |
496 break; | |
497 case Object: | |
498 masm.movq(asRegister(result), src); | |
499 break; | |
500 default: | |
501 throw GraalInternalError.shouldNotReachHere(); | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
502 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
503 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
504 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
505 private static void const2reg(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Constant input) { |
7881 | 506 /* |
507 * Note: we use the kind of the input operand (and not the kind of the result operand) | |
508 * because they don't match in all cases. For example, an object constant can be loaded to a | |
509 * long register when unsafe casts occurred (e.g., for a write barrier where arithmetic | |
510 * operations are then performed on the pointer). | |
511 */ | |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6531
diff
changeset
|
512 switch (input.getKind().getStackKind()) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
513 case Int: |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
514 if (crb.codeCache.needsDataPatch(input)) { |
13576
4e679d50ba9a
Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents:
13520
diff
changeset
|
515 crb.recordInlineDataInCode(input); |
6996
eec373d34caf
added support for annotated Constants and used it to track Klass* values in Graal and register them in the metadata section of a nmethod during code installation
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
516 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
517 // Do not optimize with an XOR as this instruction may be between |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
518 // a CMP and a Jcc in which case the XOR will modify the condition |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
519 // flags and interfere with the Jcc. |
6996
eec373d34caf
added support for annotated Constants and used it to track Klass* values in Graal and register them in the metadata section of a nmethod during code installation
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
520 masm.movl(asRegister(result), input.asInt()); |
eec373d34caf
added support for annotated Constants and used it to track Klass* values in Graal and register them in the metadata section of a nmethod during code installation
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
521 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
522 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
523 case Long: |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
524 boolean patch = false; |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
525 if (crb.codeCache.needsDataPatch(input)) { |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
526 patch = true; |
13576
4e679d50ba9a
Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents:
13520
diff
changeset
|
527 crb.recordInlineDataInCode(input); |
6996
eec373d34caf
added support for annotated Constants and used it to track Klass* values in Graal and register them in the metadata section of a nmethod during code installation
Doug Simon <doug.simon@oracle.com>
parents:
6580
diff
changeset
|
528 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
529 // Do not optimize with an XOR as this instruction may be between |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
530 // a CMP and a Jcc in which case the XOR will modify the condition |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
531 // flags and interfere with the Jcc. |
13520
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
532 if (patch) { |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
533 masm.movq(asRegister(result), input.asLong()); |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
534 } else { |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
535 if (input.asLong() == (int) input.asLong()) { |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
536 // Sign extended to long |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
537 masm.movslq(asRegister(result), (int) input.asLong()); |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
538 } else if ((input.asLong() & 0xFFFFFFFFL) == input.asLong()) { |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
539 // Zero extended to long |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
540 masm.movl(asRegister(result), (int) input.asLong()); |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
541 } else { |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
542 masm.movq(asRegister(result), input.asLong()); |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
543 } |
fb7b39f07232
Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
13240
diff
changeset
|
544 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
545 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
546 case Float: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
547 // This is *not* the same as 'constant == 0.0f' in the case where constant is -0.0f |
4581
8f985001dc27
Use kind of input operand (instead of result operand) to determine the type of moves, because an Object constant can be loaded to a Long register for unsafe operation.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4525
diff
changeset
|
548 if (Float.floatToRawIntBits(input.asFloat()) == Float.floatToRawIntBits(0.0f)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
549 assert !crb.codeCache.needsDataPatch(input); |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
550 masm.xorps(asFloatReg(result), asFloatReg(result)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
551 } else { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
552 masm.movflt(asFloatReg(result), (AMD64Address) crb.asFloatConstRef(input)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
553 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
554 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
555 case Double: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
556 // This is *not* the same as 'constant == 0.0d' in the case where constant is -0.0d |
4581
8f985001dc27
Use kind of input operand (instead of result operand) to determine the type of moves, because an Object constant can be loaded to a Long register for unsafe operation.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4525
diff
changeset
|
557 if (Double.doubleToRawLongBits(input.asDouble()) == Double.doubleToRawLongBits(0.0d)) { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
558 assert !crb.codeCache.needsDataPatch(input); |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
559 masm.xorpd(asDoubleReg(result), asDoubleReg(result)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
560 } else { |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
561 masm.movdbl(asDoubleReg(result), (AMD64Address) crb.asDoubleConstRef(input)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
562 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
563 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
564 case Object: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
565 // Do not optimize with an XOR as this instruction may be between |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
566 // a CMP and a Jcc in which case the XOR will modify the condition |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
567 // flags and interfere with the Jcc. |
4581
8f985001dc27
Use kind of input operand (instead of result operand) to determine the type of moves, because an Object constant can be loaded to a Long register for unsafe operation.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4525
diff
changeset
|
568 if (input.isNull()) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
569 masm.movq(asRegister(result), 0x0L); |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
570 } else if (crb.target.inlineObjects) { |
13576
4e679d50ba9a
Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents:
13520
diff
changeset
|
571 crb.recordInlineDataInCode(input); |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
572 masm.movq(asRegister(result), 0xDEADDEADDEADDEADL); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
573 } else { |
13576
4e679d50ba9a
Move data section building code to Java.
Roland Schatz <roland.schatz@oracle.com>
parents:
13520
diff
changeset
|
574 masm.movq(asRegister(result), (AMD64Address) crb.recordDataReferenceInCode(input, 0)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
575 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
576 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
577 default: |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
578 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
579 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
580 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
581 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
582 private static void const2stack(CompilationResultBuilder crb, AMD64MacroAssembler masm, Value result, Constant input) { |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
583 assert !crb.codeCache.needsDataPatch(input); |
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
584 AMD64Address dest = (AMD64Address) crb.asAddress(result); |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6531
diff
changeset
|
585 switch (input.getKind().getStackKind()) { |
7881 | 586 case Int: |
587 masm.movl(dest, input.asInt()); | |
588 break; | |
589 case Long: | |
590 masm.movlong(dest, input.asLong()); | |
591 break; | |
592 case Float: | |
593 masm.movl(dest, floatToRawIntBits(input.asFloat())); | |
594 break; | |
595 case Double: | |
596 masm.movlong(dest, doubleToRawLongBits(input.asDouble())); | |
597 break; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
598 case Object: |
4581
8f985001dc27
Use kind of input operand (instead of result operand) to determine the type of moves, because an Object constant can be loaded to a Long register for unsafe operation.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4525
diff
changeset
|
599 if (input.isNull()) { |
7839
838293a77af7
Make Address class platform specific.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
600 masm.movlong(dest, 0L); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
601 } else { |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
602 throw GraalInternalError.shouldNotReachHere("Non-null object constants must be in register"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
603 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
604 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
605 default: |
4524
dcc8f5c6f394
Refactorings to prepare for LIR project splitting
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4323
diff
changeset
|
606 throw GraalInternalError.shouldNotReachHere(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
607 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
608 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
609 |
13240
3543861aeeb2
fixes for eclipseformat
Doug Simon <doug.simon@oracle.com>
parents:
13227
diff
changeset
|
610 protected static void compareAndSwap(CompilationResultBuilder crb, AMD64MacroAssembler masm, AllocatableValue result, AMD64AddressValue address, AllocatableValue cmpValue, |
3543861aeeb2
fixes for eclipseformat
Doug Simon <doug.simon@oracle.com>
parents:
13227
diff
changeset
|
611 AllocatableValue newValue) { |
9791
e92fdf3e1558
Register: replace usages of object identity with equals()
Bernhard Urban <bernhard.urban@jku.at>
parents:
9297
diff
changeset
|
612 assert asRegister(cmpValue).equals(AMD64.rax) && asRegister(result).equals(AMD64.rax); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
613 |
13227
1a66453f73db
renamed TargetMethodAssembler to CompilationResultBuilder
Doug Simon <doug.simon@oracle.com>
parents:
13111
diff
changeset
|
614 if (crb.target.isMP) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
615 masm.lock(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
616 } |
6329
92bc58dc5b5e
More clean up and documentation in api.code and api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5733
diff
changeset
|
617 switch (cmpValue.getKind()) { |
7881 | 618 case Int: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
619 masm.cmpxchgl(asRegister(newValue), address.toAddress()); |
7881 | 620 break; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
621 case Long: |
7881 | 622 case Object: |
8166
d2733c9b3d0e
Convert AMD64Address to CompositeValue.
Roland Schatz <roland.schatz@oracle.com>
parents:
8144
diff
changeset
|
623 masm.cmpxchgq(asRegister(newValue), address.toAddress()); |
7881 | 624 break; |
625 default: | |
626 throw GraalInternalError.shouldNotReachHere(); | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
627 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
628 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
629 } |