Mercurial > hg > truffle
annotate graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java @ 21784:f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Mon, 08 Jun 2015 19:19:45 +0200 |
parents | d915361cc3a1 |
children |
rev | line source |
---|---|
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
1 /* |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
2 * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
4 * |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
8 * |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
14 * |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
18 * |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
21 * questions. |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
22 */ |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
23 |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
24 package com.oracle.graal.compiler.amd64; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
25 |
21673
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
26 import com.oracle.jvmci.amd64.*; |
21556
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
27 import com.oracle.jvmci.code.CallingConvention; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
28 import com.oracle.jvmci.meta.Kind; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
29 import com.oracle.jvmci.meta.JavaType; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
30 import com.oracle.jvmci.meta.PlatformKind; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
31 import com.oracle.jvmci.meta.JavaConstant; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
32 import com.oracle.jvmci.meta.Value; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
33 import com.oracle.jvmci.meta.AllocatableValue; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21554
diff
changeset
|
34 import com.oracle.jvmci.meta.LIRKind; |
21673
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
35 |
21720
d915361cc3a1
moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21708
diff
changeset
|
36 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.*; |
d915361cc3a1
moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21708
diff
changeset
|
37 import static com.oracle.graal.asm.amd64.AMD64Assembler.AMD64RMOp.*; |
d915361cc3a1
moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21708
diff
changeset
|
38 import static com.oracle.graal.asm.amd64.AMD64Assembler.OperandSize.*; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
39 |
21720
d915361cc3a1
moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21708
diff
changeset
|
40 import com.oracle.graal.asm.*; |
d915361cc3a1
moved asm, bytecode and asm.test code back to com.oracle.graal name space (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21708
diff
changeset
|
41 import com.oracle.graal.asm.amd64.AMD64Assembler.*; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
42 import com.oracle.graal.compiler.common.calc.*; |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
43 import com.oracle.graal.compiler.gen.*; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
44 import com.oracle.graal.compiler.match.*; |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
45 import com.oracle.graal.lir.*; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
46 import com.oracle.graal.lir.amd64.*; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
47 import com.oracle.graal.lir.amd64.AMD64ControlFlow.BranchOp; |
15297
3a6151ed5a25
Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
15296
diff
changeset
|
48 import com.oracle.graal.lir.gen.*; |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
49 import com.oracle.graal.nodes.*; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
50 import com.oracle.graal.nodes.calc.*; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
51 import com.oracle.graal.nodes.extended.*; |
21418
cba35d171cd1
Move memory related nodes to their own package.
Roland Schatz <roland.schatz@oracle.com>
parents:
21085
diff
changeset
|
52 import com.oracle.graal.nodes.memory.*; |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21418
diff
changeset
|
53 import com.oracle.jvmci.common.*; |
21554
b1530a6cce8c
renamed com.oracle.graal.[debug|options|hotspotvmconfig]* modules to com.oracle.jvmci.[debug|options|hotspotvmconfig]* modules (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21543
diff
changeset
|
54 import com.oracle.jvmci.debug.*; |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
55 |
14888
f6630873316b
Rename NodeLIRGenerator (and related classes and interfaces) to NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
14851
diff
changeset
|
56 public abstract class AMD64NodeLIRBuilder extends NodeLIRBuilder { |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
57 |
15333
06ecedffb109
Use LIRGeneratorTool in Backend.
Josef Eisl <josef.eisl@jku.at>
parents:
15331
diff
changeset
|
58 public AMD64NodeLIRBuilder(StructuredGraph graph, LIRGeneratorTool gen) { |
14921
88dfaf6448e0
Remove LIRGenerationResult from NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
14888
diff
changeset
|
59 super(graph, gen); |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
60 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
61 |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
62 @Override |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
63 protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { |
18692
d6c33eb93b9f
Use Register.asValue(LIRKind) where appropriate.
Josef Eisl <josef.eisl@jku.at>
parents:
18187
diff
changeset
|
64 Value targetAddressSrc = operand(callTarget.computedAddress()); |
d6c33eb93b9f
Use Register.asValue(LIRKind) where appropriate.
Josef Eisl <josef.eisl@jku.at>
parents:
18187
diff
changeset
|
65 AllocatableValue targetAddress = AMD64.rax.asValue(targetAddressSrc.getLIRKind()); |
d6c33eb93b9f
Use Register.asValue(LIRKind) where appropriate.
Josef Eisl <josef.eisl@jku.at>
parents:
18187
diff
changeset
|
66 gen.emitMove(targetAddress, targetAddressSrc); |
16564
688f84e397a3
Move the target method from MethodCallTargetNode and LoweredCallTargetNode to their superclass CallTargetNode
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
16218
diff
changeset
|
67 append(new AMD64Call.IndirectCallOp(callTarget.targetMethod(), result, parameters, temps, targetAddress, callState)); |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
68 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
69 |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
70 @Override |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
71 protected boolean peephole(ValueNode valueNode) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
72 if ((valueNode instanceof IntegerDivNode) || (valueNode instanceof IntegerRemNode)) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
73 FixedBinaryNode divRem = (FixedBinaryNode) valueNode; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
74 FixedNode node = divRem.next(); |
19582
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
75 while (true) { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
76 if (node instanceof IfNode) { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
77 IfNode ifNode = (IfNode) node; |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
78 double probability = ifNode.getTrueSuccessorProbability(); |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
79 if (probability == 1.0) { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
80 node = ifNode.trueSuccessor(); |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
81 } else if (probability == 0.0) { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
82 node = ifNode.falseSuccessor(); |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
83 } else { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
84 break; |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
85 } |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
86 } else if (!(node instanceof FixedWithNextNode)) { |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
87 break; |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
88 } |
da62d18a9da0
Small improvement to mod/div peephole optimization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18692
diff
changeset
|
89 |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
90 FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
91 if (((fixedWithNextNode instanceof IntegerDivNode) || (fixedWithNextNode instanceof IntegerRemNode)) && fixedWithNextNode.getClass() != divRem.getClass()) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
92 FixedBinaryNode otherDivRem = (FixedBinaryNode) fixedWithNextNode; |
16218
c3260b05fd26
rename x() to getX() and y() to getY() in FixedBinaryNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16207
diff
changeset
|
93 if (otherDivRem.getX() == divRem.getX() && otherDivRem.getY() == divRem.getY() && !hasOperand(otherDivRem)) { |
c3260b05fd26
rename x() to getX() and y() to getY() in FixedBinaryNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16207
diff
changeset
|
94 Value[] results = ((AMD64LIRGenerator) gen).emitIntegerDivRem(operand(divRem.getX()), operand(divRem.getY()), state((DeoptimizingNode) valueNode)); |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
95 if (divRem instanceof IntegerDivNode) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
96 setResult(divRem, results[0]); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
97 setResult(otherDivRem, results[1]); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
98 } else { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
99 setResult(divRem, results[1]); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
100 setResult(otherDivRem, results[0]); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
101 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
102 return true; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
103 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
104 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
105 node = fixedWithNextNode.next(); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
106 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
107 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
108 return false; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
109 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
110 |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
111 protected LIRFrameState getState(Access access) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
112 if (access instanceof DeoptimizingNode) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
113 return state((DeoptimizingNode) access); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
114 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
115 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
116 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
117 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
118 protected Kind getMemoryKind(Access access) { |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
16083
diff
changeset
|
119 return (Kind) gen.getLIRKind(access.asNode().stamp()).getPlatformKind(); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
120 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
121 |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
122 protected OperandSize getMemorySize(Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
123 switch (getMemoryKind(access)) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
124 case Boolean: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
125 case Byte: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
126 return OperandSize.BYTE; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
127 case Char: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
128 case Short: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
129 return OperandSize.WORD; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
130 case Int: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
131 return OperandSize.DWORD; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
132 case Long: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
133 return OperandSize.QWORD; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
134 case Float: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
135 return OperandSize.SS; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
136 case Double: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
137 return OperandSize.SD; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
138 default: |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21418
diff
changeset
|
139 throw JVMCIError.shouldNotReachHere("unsupported memory access type " + getMemoryKind(access)); |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
140 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
141 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
142 |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
143 protected ValueNode uncast(ValueNode value) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
144 if (value instanceof UnsafeCastNode) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
145 UnsafeCastNode cast = (UnsafeCastNode) value; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
146 return cast.getOriginalNode(); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
147 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
148 return value; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
149 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
150 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
151 protected ComplexMatchResult emitCompareBranchMemory(IfNode ifNode, CompareNode compare, ValueNode value, Access access) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
152 Condition cond = compare.condition(); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
153 Kind kind = getMemoryKind(access); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
154 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
155 if (value.isConstant()) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
156 JavaConstant constant = value.asJavaConstant(); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
157 if (kind == Kind.Long && !NumUtil.isInt(constant.asLong())) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
158 // Only imm32 as long |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
159 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
160 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
161 if (kind.isNumericFloat()) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
162 Debug.log("Skipping constant compares for float kinds"); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
163 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
164 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
165 if (kind == Kind.Object) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
166 if (!constant.isNull()) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
167 Debug.log("Skipping constant compares for Object kinds"); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
168 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
169 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
170 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
171 } else { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
172 if (kind == Kind.Object) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
173 // Can't compare against objects since they require encode/decode |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
174 Debug.log("Skipping compares for Object kinds"); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
175 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
176 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
177 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
178 |
16083
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
179 // emitCompareBranchMemory expects the memory on the right, so mirror the condition if |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
180 // that's not true. It might be mirrored again the actual compare is emitted but that's |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
181 // ok. |
16207
df6f2365b153
rename of x() to getX(), y() to getY() and object() to getValue()
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16156
diff
changeset
|
182 Condition finalCondition = uncast(compare.getX()) == access ? cond.mirror() : cond; |
16083
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
183 return new ComplexMatchResult() { |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
184 public Value evaluate(NodeLIRBuilder builder) { |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
185 LabelRef trueLabel = getLIRBlock(ifNode.trueSuccessor()); |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
186 LabelRef falseLabel = getLIRBlock(ifNode.falseSuccessor()); |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
187 boolean unorderedIsTrue = compare.unorderedIsTrue(); |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
188 double trueLabelProbability = ifNode.probability(ifNode.trueSuccessor()); |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
189 Value other; |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
190 if (value.isConstant()) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
191 other = value.asJavaConstant(); |
16083
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
192 } else { |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
193 other = operand(value); |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
194 } |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
195 |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
196 AMD64AddressValue address = (AMD64AddressValue) operand(access.getAddress()); |
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
197 getLIRGeneratorTool().emitCompareBranchMemory(kind, other, address, getState(access), finalCondition, unorderedIsTrue, trueLabel, falseLabel, trueLabelProbability); |
16083
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
198 return null; |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
199 } |
640a875667fe
Remove dead code.
Roland Schatz <roland.schatz@oracle.com>
parents:
15610
diff
changeset
|
200 }; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
201 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
202 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
203 private ComplexMatchResult emitIntegerTestBranchMemory(IfNode x, ValueNode value, Access access) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
204 LabelRef trueLabel = getLIRBlock(x.trueSuccessor()); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
205 LabelRef falseLabel = getLIRBlock(x.falseSuccessor()); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
206 double trueLabelProbability = x.probability(x.trueSuccessor()); |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
207 Kind kind = getMemoryKind(access); |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
208 OperandSize size = kind == Kind.Long ? QWORD : DWORD; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
209 if (value.isConstant()) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
210 if (kind != kind.getStackKind()) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
211 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
212 } |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
213 JavaConstant constant = value.asJavaConstant(); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
214 if (kind == Kind.Long && !NumUtil.isInt(constant.asLong())) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
215 // Only imm32 as long |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
216 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
217 } |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
218 return builder -> { |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
219 AMD64AddressValue address = (AMD64AddressValue) operand(access.getAddress()); |
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
220 gen.append(new AMD64BinaryConsumer.MemoryConstOp(AMD64MIOp.TEST, size, address, (int) constant.asLong(), getState(access))); |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
221 gen.append(new BranchOp(Condition.EQ, trueLabel, falseLabel, trueLabelProbability)); |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
222 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
223 }; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
224 } else { |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
225 return builder -> { |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
226 AMD64AddressValue address = (AMD64AddressValue) operand(access.getAddress()); |
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
227 gen.append(new AMD64BinaryConsumer.MemoryRMOp(AMD64RMOp.TEST, size, gen.asAllocatable(operand(value)), address, getState(access))); |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
228 gen.append(new BranchOp(Condition.EQ, trueLabel, falseLabel, trueLabelProbability)); |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
229 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
230 }; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
231 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
232 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
233 |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
234 protected ComplexMatchResult emitConvertMemoryOp(PlatformKind kind, AMD64RMOp op, OperandSize size, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
235 return builder -> { |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
236 AMD64AddressValue address = (AMD64AddressValue) operand(access.getAddress()); |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
237 LIRFrameState state = getState(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
238 return getLIRGeneratorTool().emitConvertMemoryOp(kind, op, size, address, state); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
239 }; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
240 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
241 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
242 private ComplexMatchResult emitSignExtendMemory(Access access, int fromBits, int toBits) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
243 assert fromBits <= toBits && toBits <= 64; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
244 Kind kind = null; |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
245 AMD64RMOp op; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
246 OperandSize size; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
247 if (fromBits == toBits) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
248 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
249 } else if (toBits > 32) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
250 kind = Kind.Long; |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
251 size = QWORD; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
252 // sign extend to 64 bits |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
253 switch (fromBits) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
254 case 8: |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
255 op = MOVSXB; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
256 break; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
257 case 16: |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
258 op = MOVSX; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
259 break; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
260 case 32: |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
261 op = MOVSXD; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
262 break; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
263 default: |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21418
diff
changeset
|
264 throw JVMCIError.unimplemented("unsupported sign extension (" + fromBits + " bit -> " + toBits + " bit)"); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
265 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
266 } else { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
267 kind = Kind.Int; |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
268 size = DWORD; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
269 // sign extend to 32 bits (smaller values are internally represented as 32 bit values) |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
270 switch (fromBits) { |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
271 case 8: |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
272 op = MOVSXB; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
273 break; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
274 case 16: |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
275 op = MOVSX; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
276 break; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
277 case 32: |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
278 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
279 default: |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21418
diff
changeset
|
280 throw JVMCIError.unimplemented("unsupported sign extension (" + fromBits + " bit -> " + toBits + " bit)"); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
281 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
282 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
283 if (kind != null && op != null) { |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
284 return emitConvertMemoryOp(kind, op, size, access); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
285 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
286 return null; |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
287 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
288 |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
16083
diff
changeset
|
289 private Value emitReinterpretMemory(LIRKind to, Access access) { |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
290 AMD64AddressValue address = (AMD64AddressValue) operand(access.getAddress()); |
15610
c44cf62d1c97
Simplify code generation of reinterpret-memory.
Roland Schatz <roland.schatz@oracle.com>
parents:
15554
diff
changeset
|
291 LIRFrameState state = getState(access); |
c44cf62d1c97
Simplify code generation of reinterpret-memory.
Roland Schatz <roland.schatz@oracle.com>
parents:
15554
diff
changeset
|
292 return getLIRGeneratorTool().emitLoad(to, address, state); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
293 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
294 |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
295 @MatchRule("(If (IntegerTest Read=access value))") |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
296 @MatchRule("(If (IntegerTest FloatingRead=access value))") |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
297 public ComplexMatchResult integerTestBranchMemory(IfNode root, Access access, ValueNode value) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
298 return emitIntegerTestBranchMemory(root, value, access); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
299 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
300 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
301 @MatchRule("(If (IntegerEquals=compare value Read=access))") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
302 @MatchRule("(If (IntegerLessThan=compare value Read=access))") |
16601
cd25e42d9b22
rename IntegerBelowThanNode to IntegerBelowNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16573
diff
changeset
|
303 @MatchRule("(If (IntegerBelow=compare value Read=access))") |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
304 @MatchRule("(If (IntegerEquals=compare value FloatingRead=access))") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
305 @MatchRule("(If (IntegerLessThan=compare value FloatingRead=access))") |
16601
cd25e42d9b22
rename IntegerBelowThanNode to IntegerBelowNode
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16573
diff
changeset
|
306 @MatchRule("(If (IntegerBelow=compare value FloatingRead=access))") |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
307 @MatchRule("(If (FloatEquals=compare value Read=access))") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
308 @MatchRule("(If (FloatEquals=compare value FloatingRead=access))") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
309 @MatchRule("(If (FloatLessThan=compare value Read=access))") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
310 @MatchRule("(If (FloatLessThan=compare value FloatingRead=access))") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
311 public ComplexMatchResult ifCompareMemory(IfNode root, CompareNode compare, ValueNode value, Access access) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
312 return emitCompareBranchMemory(root, compare, value, access); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
313 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
314 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
315 @MatchRule("(Or (LeftShift=lshift value Constant) (UnsignedRightShift=rshift value Constant))") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
316 public ComplexMatchResult rotateLeftConstant(LeftShiftNode lshift, UnsignedRightShiftNode rshift) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
317 if ((lshift.getShiftAmountMask() & (lshift.getY().asJavaConstant().asInt() + rshift.getY().asJavaConstant().asInt())) == 0) { |
16207
df6f2365b153
rename of x() to getX(), y() to getY() and object() to getValue()
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16156
diff
changeset
|
318 return builder -> getLIRGeneratorTool().emitRol(operand(lshift.getX()), operand(lshift.getY())); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
319 } |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
320 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
321 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
322 |
17197
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
323 @MatchRule("(Or (LeftShift value (Sub Constant=delta shiftAmount)) (UnsignedRightShift value shiftAmount))") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
324 public ComplexMatchResult rotateRightVariable(ValueNode value, ConstantNode delta, ValueNode shiftAmount) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
325 if (delta.asJavaConstant().asLong() == 0 || delta.asJavaConstant().asLong() == 32) { |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
326 return builder -> getLIRGeneratorTool().emitRor(operand(value), operand(shiftAmount)); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
327 } |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
328 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
329 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
330 |
17197
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
331 @MatchRule("(Or (LeftShift value shiftAmount) (UnsignedRightShift value (Sub Constant=delta shiftAmount)))") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
332 public ComplexMatchResult rotateLeftVariable(ValueNode value, ValueNode shiftAmount, ConstantNode delta) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18149
diff
changeset
|
333 if (delta.asJavaConstant().asLong() == 0 || delta.asJavaConstant().asLong() == 32) { |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
334 return builder -> getLIRGeneratorTool().emitRol(operand(value), operand(shiftAmount)); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
335 } |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
336 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
337 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
338 |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
339 private ComplexMatchResult binaryRead(AMD64RMOp op, OperandSize size, ValueNode value, Access access) { |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
340 return builder -> getLIRGeneratorTool().emitBinaryMemory(op, size, getLIRGeneratorTool().asAllocatable(operand(value)), (AMD64AddressValue) operand(access.getAddress()), getState(access)); |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
341 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
342 |
17197
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
343 @MatchRule("(Add value Read=access)") |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
344 @MatchRule("(Add value FloatingRead=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
345 public ComplexMatchResult addMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
346 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
347 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
348 return binaryRead(SSEOp.ADD, size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
349 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
350 return binaryRead(ADD.getRMOpcode(size), size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
351 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
352 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
353 |
17197
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
354 @MatchRule("(Sub value Read=access)") |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
355 @MatchRule("(Sub value FloatingRead=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
356 public ComplexMatchResult subMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
357 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
358 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
359 return binaryRead(SSEOp.SUB, size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
360 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
361 return binaryRead(SUB.getRMOpcode(size), size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
362 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
363 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
364 |
17197
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
365 @MatchRule("(Mul value Read=access)") |
ec35bb4eccb8
Add support for other data types to integer arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
16982
diff
changeset
|
366 @MatchRule("(Mul value FloatingRead=access)") |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
367 public ComplexMatchResult mulMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
368 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
369 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
370 return binaryRead(SSEOp.MUL, size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
371 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
372 return binaryRead(AMD64RMOp.IMUL, size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
373 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
374 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
375 |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
376 @MatchRule("(And value Read=access)") |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
377 @MatchRule("(And value FloatingRead=access)") |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
378 public ComplexMatchResult andMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
379 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
380 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
381 return null; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
382 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
383 return binaryRead(AND.getRMOpcode(size), size, value, access); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
384 } |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
385 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
386 |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
387 @MatchRule("(Or value Read=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
388 @MatchRule("(Or value FloatingRead=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
389 public ComplexMatchResult orMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
390 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
391 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
392 return null; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
393 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
394 return binaryRead(OR.getRMOpcode(size), size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
395 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
396 } |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
397 |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
398 @MatchRule("(Xor value Read=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
399 @MatchRule("(Xor value FloatingRead=access)") |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
400 public ComplexMatchResult xorMemory(ValueNode value, Access access) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
401 OperandSize size = getMemorySize(access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
402 if (size.isXmmType()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
403 return null; |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
404 } else { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
405 return binaryRead(XOR.getRMOpcode(size), size, value, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
406 } |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
407 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
408 |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
409 @MatchRule("(Write object Narrow=narrow)") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
410 public ComplexMatchResult writeNarrow(WriteNode root, NarrowNode narrow) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
411 return builder -> { |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
16083
diff
changeset
|
412 LIRKind writeKind = getLIRGeneratorTool().getLIRKind(root.value().stamp()); |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
413 getLIRGeneratorTool().emitStore(writeKind, operand(root.getAddress()), operand(narrow.getValue()), state(root)); |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
414 return null; |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
415 }; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
416 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
417 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
418 @MatchRule("(SignExtend Read=access)") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
419 @MatchRule("(SignExtend FloatingRead=access)") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
420 public ComplexMatchResult signExtend(SignExtendNode root, Access access) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
421 return emitSignExtendMemory(access, root.getInputBits(), root.getResultBits()); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
422 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
423 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
424 @MatchRule("(ZeroExtend Read=access)") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
425 @MatchRule("(ZeroExtend FloatingRead=access)") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
426 public ComplexMatchResult zeroExtend(ZeroExtendNode root, Access access) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
427 Kind memoryKind = getMemoryKind(access); |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
428 if (memoryKind.getBitCount() != root.getInputBits() && !memoryKind.isUnsigned()) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
429 /* |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
430 * The memory being read from is signed and smaller than the result size so this is a |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
431 * sign extension to inputBits followed by a zero extension to resultBits which can't be |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
432 * expressed in a memory operation. |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
433 */ |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
434 return null; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
435 } |
21784
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
436 return builder -> getLIRGeneratorTool().emitZeroExtendMemory(memoryKind == Kind.Short ? Kind.Char : memoryKind, root.getResultBits(), (AMD64AddressValue) operand(access.getAddress()), |
f4e1d958f1c3
[AMD64] Create AMD64 specific address nodes.
Roland Schatz <roland.schatz@oracle.com>
parents:
21720
diff
changeset
|
437 getState(access)); |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
438 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
439 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
440 @MatchRule("(FloatConvert Read=access)") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
441 @MatchRule("(FloatConvert FloatingRead=access)") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
442 public ComplexMatchResult floatConvert(FloatConvertNode root, Access access) { |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
443 switch (root.getFloatConvert()) { |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
444 case D2F: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
445 return emitConvertMemoryOp(Kind.Float, SSEOp.CVTSD2SS, SD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
446 case D2I: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
447 return emitConvertMemoryOp(Kind.Int, SSEOp.CVTTSD2SI, DWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
448 case D2L: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
449 return emitConvertMemoryOp(Kind.Long, SSEOp.CVTTSD2SI, QWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
450 case F2D: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
451 return emitConvertMemoryOp(Kind.Double, SSEOp.CVTSS2SD, SS, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
452 case F2I: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
453 return emitConvertMemoryOp(Kind.Int, SSEOp.CVTTSS2SI, DWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
454 case F2L: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
455 return emitConvertMemoryOp(Kind.Long, SSEOp.CVTTSS2SI, QWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
456 case I2D: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
457 return emitConvertMemoryOp(Kind.Double, SSEOp.CVTSI2SD, DWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
458 case I2F: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
459 return emitConvertMemoryOp(Kind.Float, SSEOp.CVTSI2SS, DWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
460 case L2D: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
461 return emitConvertMemoryOp(Kind.Double, SSEOp.CVTSI2SD, QWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
462 case L2F: |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
463 return emitConvertMemoryOp(Kind.Float, SSEOp.CVTSI2SS, QWORD, access); |
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
464 default: |
21543
93c50cefb9e8
moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21418
diff
changeset
|
465 throw JVMCIError.shouldNotReachHere(); |
19867
89c729e9e0a4
Refactoring of AMD64 code generation.
Roland Schatz <roland.schatz@oracle.com>
parents:
19582
diff
changeset
|
466 } |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
467 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
468 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
469 @MatchRule("(Reinterpret Read=access)") |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
470 @MatchRule("(Reinterpret FloatingRead=access)") |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
471 public ComplexMatchResult reinterpret(ReinterpretNode root, Access access) { |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
472 return builder -> { |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
16083
diff
changeset
|
473 LIRKind kind = getLIRGeneratorTool().getLIRKind(root.stamp()); |
15453
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
474 return emitReinterpretMemory(kind, access); |
100306ae985b
switch MatchRule from class to method annotation and fix review feedback
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15413
diff
changeset
|
475 }; |
15370
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
476 |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
477 } |
319deee16746
add support for matching multiple HIR nodes when lowering to LIR
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15333
diff
changeset
|
478 |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
479 @Override |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
480 public void visitBreakpointNode(BreakpointNode node) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
481 JavaType[] sig = new JavaType[node.arguments().size()]; |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
482 for (int i = 0; i < sig.length; i++) { |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
483 sig[i] = node.arguments().get(i).stamp().javaType(gen.getMetaAccess()); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
484 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
485 |
18149
c6086a18c9ce
Rename LIRGenerationResult.getFrameMap() to getFrameMapBuilder().
Josef Eisl <josef.eisl@jku.at>
parents:
18123
diff
changeset
|
486 Value[] parameters = visitInvokeArguments(gen.getResult().getFrameMapBuilder().getRegisterConfig().getCallingConvention(CallingConvention.Type.JavaCall, null, sig, gen.target(), false), |
18123
3c7e73362d6a
Encapsulate FrameMap.registerConfig & FrameMap.target.
Josef Eisl <josef.eisl@jku.at>
parents:
17450
diff
changeset
|
487 node.arguments()); |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
488 append(new AMD64BreakpointOp(parameters)); |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
489 } |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
490 |
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
491 @Override |
15331
71cdf5518dab
Use LIRGeneratorTool in NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
15301
diff
changeset
|
492 public AMD64LIRGenerator getLIRGeneratorTool() { |
14850 | 493 return (AMD64LIRGenerator) gen; |
494 } | |
14841
47e4d2e01c6e
Split LIRGenerator and fix AMD64 backend.
Josef Eisl <josef.eisl@jku.at>
parents:
diff
changeset
|
495 } |