annotate graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ReinterpretNode.java @ 14011:134491e79cde

Use correct PlatformKind in reinterpret LIR generation.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 24 Feb 2014 15:06:07 +0100
parents 958c99d0790c
children dbe41340d0a6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
1 /*
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
4 *
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
8 *
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
13 * accompanied this code).
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
14 *
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
18 *
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
21 * questions.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
22 */
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.nodes.calc;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
24
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
25 import com.oracle.graal.api.meta.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
26 import com.oracle.graal.graph.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
27 import com.oracle.graal.graph.spi.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.nodes.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.nodes.spi.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.nodes.type.*;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
31
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
32 /**
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
33 * The {@code ReinterpretNode} class represents a reinterpreting conversion that changes the stamp
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
34 * of a primitive value to some other incompatible stamp. The new stamp must have the same width as
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
35 * the old stamp.
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
36 */
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
37 public class ReinterpretNode extends FloatingNode implements Canonicalizable, ArithmeticLIRLowerable {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
38
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
39 @Input private ValueNode value;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
40
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
41 public ValueNode value() {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
42 return value;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
43 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
44
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
45 private ReinterpretNode(Kind to, ValueNode value) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
46 this(StampFactory.forKind(to), value);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
47 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
48
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
49 public ReinterpretNode(Stamp to, ValueNode value) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
50 super(to);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
51 assert to instanceof PrimitiveStamp;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
52 this.value = value;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
53 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
54
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
55 public Constant evalConst(Constant... inputs) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
56 assert inputs.length == 1;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
57 Constant c = inputs[0];
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
58 assert c.getKind().getBitCount() == ((PrimitiveStamp) stamp()).getBits();
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
59 switch (c.getKind()) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
60 case Int:
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
61 if (stamp() instanceof FloatStamp) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
62 return Constant.forFloat(Float.intBitsToFloat(c.asInt()));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
63 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
64 return c;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
65 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
66 case Long:
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
67 if (stamp() instanceof FloatStamp) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
68 return Constant.forDouble(Double.longBitsToDouble(c.asLong()));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
69 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
70 return c;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
71 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
72 case Float:
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
73 if (stamp() instanceof IntegerStamp) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
74 return Constant.forInt(Float.floatToRawIntBits(c.asFloat()));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
75 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
76 return c;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
77 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
78 case Double:
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
79 if (stamp() instanceof IntegerStamp) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
80 return Constant.forLong(Double.doubleToRawLongBits(c.asDouble()));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
81 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
82 return c;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
83 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
84 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
85 throw GraalInternalError.shouldNotReachHere();
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
86 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
87
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
88 @Override
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
89 public Node canonical(CanonicalizerTool tool) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
90 if (value.isConstant()) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
91 return ConstantNode.forPrimitive(evalConst(value.asConstant()), graph());
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
92 }
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
93 if (stamp().isCompatible(value.stamp())) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
94 return value;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
95 }
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
96 return this;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
97 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
98
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
99 @Override
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
100 public void generate(ArithmeticLIRGenerator gen) {
14011
134491e79cde Use correct PlatformKind in reinterpret LIR generation.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
101 PlatformKind kind = gen.getPlatformKind(stamp());
134491e79cde Use correct PlatformKind in reinterpret LIR generation.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
102 gen.setResult(this, gen.emitReinterpret(kind, gen.operand(value())));
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
103 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
104
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
105 public static ValueNode reinterpret(Kind toKind, ValueNode value) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
106 return value.graph().unique(new ReinterpretNode(toKind, value));
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
107 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
108
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
109 @NodeIntrinsic
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
110 public static native float reinterpret(@ConstantNodeParameter Kind kind, int value);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
111
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
112 @NodeIntrinsic
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
113 public static native int reinterpret(@ConstantNodeParameter Kind kind, float value);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
114
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
115 @NodeIntrinsic
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
116 public static native double reinterpret(@ConstantNodeParameter Kind kind, long value);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
117
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
118 @NodeIntrinsic
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
119 public static native long reinterpret(@ConstantNodeParameter Kind kind, double value);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
120 }