annotate graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LeftShift.java @ 3516:9b59afa78775

Remove copy method from nodes.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Mon, 08 Aug 2011 23:27:54 +0200
parents ce7cf6d16b38
children 16cee060c446
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
1 /*
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
4 *
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
8 *
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
13 * accompanied this code).
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
14 *
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
18 *
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
21 * questions.
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
22 */
2874
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
23 package com.oracle.max.graal.compiler.ir;
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
24
2899
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
25 import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp;
3490
ce7cf6d16b38 Reintroduce Conditional (IfOp) using the new infrastructure, fix the Cmov support in the backend, use x86 cmov when possible, make it work with floating point comparison conditions, make MaterializeNode a subclass of Conditional, fix nasty bug related to introducing LIR jumps in an existing LIRBlock in MaterializeNode/Conditional
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2899
diff changeset
26 import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.NotifyReProcess;
2874
d90bf514d647 Renamed packages.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 2872
diff changeset
27 import com.oracle.max.graal.graph.*;
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
28 import com.sun.cri.bytecode.*;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
29 import com.sun.cri.ci.*;
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
30
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
31
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
32 public final class LeftShift extends Shift {
2899
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
33 private static final LeftShiftCanonicalizerOp CANONICALIZER = new LeftShiftCanonicalizerOp();
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
34
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
35 public LeftShift(CiKind kind, Value x, Value y, Graph graph) {
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
36 super(kind, kind == CiKind.Int ? Bytecodes.ISHL : Bytecodes.LSHL, x, y, graph);
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
37 }
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
38
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
39 @Override
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
40 public String shortName() {
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
41 return "<<";
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
42 }
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
43
2899
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
44 @SuppressWarnings("unchecked")
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
45 @Override
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
46 public <T extends Op> T lookup(Class<T> clazz) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
47 if (clazz == CanonicalizerOp.class) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
48 return (T) CANONICALIZER;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
49 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
50 return super.lookup(clazz);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
51 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
52
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
53 private static class LeftShiftCanonicalizerOp implements CanonicalizerOp {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
54 @Override
3490
ce7cf6d16b38 Reintroduce Conditional (IfOp) using the new infrastructure, fix the Cmov support in the backend, use x86 cmov when possible, make it work with floating point comparison conditions, make MaterializeNode a subclass of Conditional, fix nasty bug related to introducing LIR jumps in an existing LIRBlock in MaterializeNode/Conditional
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2899
diff changeset
55 public Node canonical(Node node, NotifyReProcess reProcess) {
2899
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
56 LeftShift leftShift = (LeftShift) node;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
57 CiKind kind = leftShift.kind;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
58 Graph graph = leftShift.graph();
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
59 Value value = leftShift.x();
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
60 Value y = leftShift.y();
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
61 if (y.isConstant()) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
62 int amount = y.asConstant().asInt();
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
63 int originalAmout = amount;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
64 int mask;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
65 if (kind == CiKind.Int) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
66 mask = 0x1f;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
67 } else {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
68 assert kind == CiKind.Long;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
69 mask = 0x3f;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
70 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
71 amount &= mask;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
72 if (value.isConstant()) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
73 if (kind == CiKind.Int) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
74 return Constant.forInt(value.asConstant().asInt() << amount, graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
75 } else {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
76 assert kind == CiKind.Long;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
77 return Constant.forLong(value.asConstant().asLong() << amount, graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
78 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
79 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
80 if (amount == 0) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
81 return value;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
82 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
83 if (value instanceof Shift) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
84 Shift other = (Shift) value;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
85 if (other.y().isConstant()) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
86 int otherAmount = other.y().asConstant().asInt() & mask;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
87 if (other instanceof LeftShift) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
88 int total = amount + otherAmount;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
89 if (total != (total & mask)) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
90 return Constant.forInt(0, graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
91 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
92 return new LeftShift(kind, other.x(), Constant.forInt(total, graph), graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
93 } else if ((other instanceof RightShift || other instanceof UnsignedRightShift) && otherAmount == amount) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
94 if (kind == CiKind.Long) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
95 return new And(kind, other.x(), Constant.forLong(-1L << amount, graph), graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
96 } else {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
97 assert kind == CiKind.Int;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
98 return new And(kind, other.x(), Constant.forInt(-1 << amount, graph), graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
99 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
100 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
101 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
102 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
103 if (originalAmout != amount) {
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
104 return new LeftShift(kind, value, Constant.forInt(amount, graph), graph);
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
105 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
106 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
107 return leftShift;
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
108 }
80d27a8a022b Fix on canonicalization plus canonicalization of shifts and integer arithmetics
Gilles Duboscq <gilles.duboscq@oracle.com>
parents: 2880
diff changeset
109 }
2865
7a4e6e11877f Subclasses for Shift
Gilles Duboscq <gilles.duboscq@oracle.com>
parents:
diff changeset
110 }