annotate graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java @ 14061:a3cd3403a958

Remove unused imports.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 26 Feb 2014 13:09:16 +0100
parents 38c881305352
children 0ddb3b3665bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7740
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
13541
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
2 * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
7740
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
4 *
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
8 *
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
13 * accompanied this code).
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
14 *
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
18 *
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
21 * questions.
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
22 */
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
23
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
24 package com.oracle.graal.compiler.sparc;
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
25
9828
5aedcaed6ccf Initial SPARC control instructions
Morris Meyer <morris.meyer@oracle.com>
parents: 9825
diff changeset
26 import static com.oracle.graal.api.code.ValueUtil.*;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
27 import static com.oracle.graal.lir.sparc.SPARCArithmetic.*;
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
28 import static com.oracle.graal.lir.sparc.SPARCBitManipulationOp.IntrinsicOpcode.*;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
29 import static com.oracle.graal.lir.sparc.SPARCCompare.*;
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
30 import static com.oracle.graal.lir.sparc.SPARCMathIntrinsicOp.IntrinsicOpcode.*;
9814
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
31
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
32 import com.oracle.graal.api.code.*;
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
33 import com.oracle.graal.api.meta.*;
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
34 import com.oracle.graal.asm.*;
10459
f78079947084 some basic SPARC arithmetic works
twisti
parents: 10077
diff changeset
35 import com.oracle.graal.asm.sparc.*;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
36 import com.oracle.graal.compiler.gen.*;
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
37 import com.oracle.graal.graph.*;
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
38 import com.oracle.graal.lir.*;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
39 import com.oracle.graal.lir.StandardOp.JumpOp;
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
40 import com.oracle.graal.lir.sparc.*;
11289
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
41 import com.oracle.graal.lir.sparc.SPARCArithmetic.BinaryCommutative;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
42 import com.oracle.graal.lir.sparc.SPARCArithmetic.BinaryRegConst;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
43 import com.oracle.graal.lir.sparc.SPARCArithmetic.BinaryRegReg;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
44 import com.oracle.graal.lir.sparc.SPARCArithmetic.Op1Stack;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
45 import com.oracle.graal.lir.sparc.SPARCArithmetic.Op2Stack;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
46 import com.oracle.graal.lir.sparc.SPARCArithmetic.RemOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
47 import com.oracle.graal.lir.sparc.SPARCArithmetic.Unary2Op;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
48 import com.oracle.graal.lir.sparc.SPARCCompare.CompareOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
49 import com.oracle.graal.lir.sparc.SPARCControlFlow.BranchOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
50 import com.oracle.graal.lir.sparc.SPARCControlFlow.CondMoveOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
51 import com.oracle.graal.lir.sparc.SPARCControlFlow.FloatCondMoveOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
52 import com.oracle.graal.lir.sparc.SPARCControlFlow.ReturnOp;
13294
29907e69ae8d rework of switch generation: move code into platform independent SwitchStrategy, add boolean switch strategy
Lukas Stadler <lukas.stadler@jku.at>
parents: 13268
diff changeset
53 import com.oracle.graal.lir.sparc.SPARCControlFlow.StrategySwitchOp;
11289
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
54 import com.oracle.graal.lir.sparc.SPARCControlFlow.TableSwitchOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
55 import com.oracle.graal.lir.sparc.SPARCMove.MembarOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
56 import com.oracle.graal.lir.sparc.SPARCMove.NullCheckOp;
2ad1435489d1 Use ArithmeticLIRGenerator in arithmetic nodes.
Roland Schatz <roland.schatz@oracle.com>
parents: 11233
diff changeset
57 import com.oracle.graal.lir.sparc.SPARCMove.StackLoadAddressOp;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
58 import com.oracle.graal.nodes.*;
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
59 import com.oracle.graal.nodes.calc.*;
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
60 import com.oracle.graal.nodes.calc.FloatConvertNode.FloatConvert;
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
61 import com.oracle.graal.nodes.java.*;
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
62 import com.oracle.graal.nodes.type.*;
12363
78e5badf4b8e moved lookupForeignCall() from CodeCacheProvider to ForeignCallsProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
63 import com.oracle.graal.phases.util.*;
7740
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
64
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
65 /**
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
66 * This class implements the SPARC specific portion of the LIR generator.
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
67 */
10686
73122b5edf6a SPARC: Can compile simple methods and do static calls.
twisti
parents: 10470
diff changeset
68 public abstract class SPARCLIRGenerator extends LIRGenerator {
7740
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
69
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
70 public SPARCLIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) {
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
71 super(graph, providers, frameMap, cc, lir);
9814
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
72 }
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
73
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
74 @Override
13520
fb7b39f07232 Embed compressed constants when possible and use more efficient patterns for encoding
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13302
diff changeset
75 public boolean canStoreConstant(Constant c, boolean isCompressed) {
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
76 // SPARC can only store integer null constants (via g0)
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
77 switch (c.getKind()) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
78 case Float:
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
79 case Double:
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
80 return false;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
81 default:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
82 return c.isDefaultForKind();
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
83 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
84 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
85
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
86 @Override
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
87 public boolean canInlineConstant(Constant c) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
88 switch (c.getKind()) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
89 case Int:
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
90 return SPARCAssembler.isSimm13(c.asInt()) && !getCodeCache().needsDataPatch(c);
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
91 case Long:
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
92 return SPARCAssembler.isSimm13(c.asLong()) && !getCodeCache().needsDataPatch(c);
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
93 case Object:
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
94 return c.isNull();
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
95 default:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
96 return false;
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
97 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
98 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
99
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
100 @Override
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
101 public Variable emitMove(Value input) {
9814
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
102 Variable result = newVariable(input.getKind());
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
103 emitMove(result, input);
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
104 return result;
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
105 }
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
106
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
107 @Override
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
108 public void emitMove(AllocatableValue dst, Value src) {
14057
38c881305352 Move functionality of SpillMoveFactory to FrameMap.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 14003
diff changeset
109 append(SPARCMove.createMove(dst, src));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
110 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
111
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
112 @Override
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
113 public SPARCAddressValue emitAddress(Value base, long displacement, Value index, int scale) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
114 AllocatableValue baseRegister;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
115 long finalDisp = displacement;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
116 if (isConstant(base)) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
117 if (asConstant(base).isNull()) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
118 baseRegister = Value.ILLEGAL;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
119 } else if (asConstant(base).getKind() != Kind.Object) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
120 finalDisp += asConstant(base).asLong();
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
121 baseRegister = Value.ILLEGAL;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
122 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
123 baseRegister = load(base);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
124 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
125 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
126 baseRegister = asAllocatable(base);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
127 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
128
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
129 AllocatableValue indexRegister;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
130 if (!index.equals(Value.ILLEGAL) && scale != 0) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
131 if (isConstant(index)) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
132 finalDisp += asConstant(index).asLong() * scale;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
133 indexRegister = Value.ILLEGAL;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
134 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
135 if (scale != 1) {
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
136 Value longIndex = emitSignExtend(index, 32, 64);
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
137 if (CodeUtil.isPowerOf2(scale)) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
138 indexRegister = emitShl(longIndex, Constant.forLong(CodeUtil.log2(scale)));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
139 } else {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
140 indexRegister = emitMul(longIndex, Constant.forLong(scale));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
141 }
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
142 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
143 indexRegister = asAllocatable(index);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
144 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
145
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
146 // if (baseRegister.equals(Value.ILLEGAL)) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
147 // baseRegister = asAllocatable(indexRegister);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
148 // } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
149 // Variable newBase = newVariable(Kind.Long);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
150 // emitMove(newBase, baseRegister);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
151 // baseRegister = newBase;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
152 // baseRegister = emitAdd(baseRegister, indexRegister);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
153 // }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
154 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
155 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
156 indexRegister = Value.ILLEGAL;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
157 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
158
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
159 int displacementInt;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
160
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
161 // If we don't have an index register we can use a displacement, otherwise load the
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
162 // displacement into a register and add it to the base.
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
163 if (indexRegister.equals(Value.ILLEGAL)) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
164 // TODO What if displacement if too big?
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
165 displacementInt = (int) finalDisp;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
166 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
167 displacementInt = 0;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
168 if (baseRegister.equals(Value.ILLEGAL)) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
169 baseRegister = load(Constant.forLong(finalDisp));
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
170 } else {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
171 Variable longBaseRegister = newVariable(Kind.Long);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
172 emitMove(longBaseRegister, baseRegister); // FIXME get rid of this move
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
173 baseRegister = emitAdd(longBaseRegister, Constant.forLong(finalDisp));
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
174 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
175 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
176
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
177 return new SPARCAddressValue(target().wordKind, baseRegister, indexRegister, displacementInt);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
178 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
179
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
180 protected SPARCAddressValue asAddressValue(Value address) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
181 if (address instanceof SPARCAddressValue) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
182 return (SPARCAddressValue) address;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
183 } else {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
184 return emitAddress(address, 0, Value.ILLEGAL, 0);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
185 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
186 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
187
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
188 @Override
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
189 public Value emitAddress(StackSlot address) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
190 Variable result = newVariable(target().wordKind);
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
191 append(new StackLoadAddressOp(result, address));
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
192 return result;
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
193 }
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
194
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
195 @Override
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
196 protected boolean peephole(ValueNode valueNode) {
9816
4e9854086532 Initial SPARC compilation test
Morris Meyer <morris.meyer@oracle.com>
parents: 9814
diff changeset
197 // No peephole optimizations for now
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
198 return false;
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
199 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
200
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
201 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
202 protected void emitReturn(Value input) {
9816
4e9854086532 Initial SPARC compilation test
Morris Meyer <morris.meyer@oracle.com>
parents: 9814
diff changeset
203 append(new ReturnOp(input));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
204 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
205
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
206 @Override
8293
ae7e78091f03 Cleanup branching and jumps in LIRGenerator: JumpOp/BranchOp do not need a state. In emitBranch, emitNullCheckBranch, emitCompareBranch, emitOverflowCheckBranch and emitIntegerTestBranch both targets are always provided.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8292
diff changeset
207 public void emitJump(LabelRef label) {
9828
5aedcaed6ccf Initial SPARC control instructions
Morris Meyer <morris.meyer@oracle.com>
parents: 9825
diff changeset
208 append(new JumpOp(label));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
209 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
210
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
211 @Override
13908
8f3cd93813f1 Use branch probability for emitting conditional jump.
Roland Schatz <roland.schatz@oracle.com>
parents: 13907
diff changeset
212 public void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) {
10694
31266ceb86ef SPARC: Can compile and run two or three methods of a bootstrap.
twisti
parents: 10686
diff changeset
213 boolean mirrored = emitCompare(left, right);
31266ceb86ef SPARC: Can compile and run two or three methods of a bootstrap.
twisti
parents: 10686
diff changeset
214 Condition finalCondition = mirrored ? cond.mirror() : cond;
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
215 Kind kind = left.getKind().getStackKind();
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
216 switch (kind) {
9831
705aca4ebf2f SPARC array, load / store and compare operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9829
diff changeset
217 case Int:
705aca4ebf2f SPARC array, load / store and compare operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9829
diff changeset
218 case Long:
10694
31266ceb86ef SPARC: Can compile and run two or three methods of a bootstrap.
twisti
parents: 10686
diff changeset
219 case Object:
13268
68b964b6dc8e introduced BlockEndOp interface and require that every LIR block is terminated by such an operation
Doug Simon <doug.simon@oracle.com>
parents: 12695
diff changeset
220 append(new BranchOp(finalCondition, trueDestination, falseDestination, kind));
9831
705aca4ebf2f SPARC array, load / store and compare operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9829
diff changeset
221 break;
12503
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
222 // case Float:
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
223 // append(new CompareOp(FCMP, x, y));
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
224 // append(new BranchOp(condition, label));
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
225 // break;
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
226 // case Double:
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
227 // append(new CompareOp(DCMP, x, y));
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
228 // append(new BranchOp(condition, label));
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
229 // break;
9825
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
230 default:
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
231 throw GraalInternalError.shouldNotReachHere("" + left.getKind());
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
232 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
233 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
234
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
235 @Override
13908
8f3cd93813f1 Use branch probability for emitting conditional jump.
Roland Schatz <roland.schatz@oracle.com>
parents: 13907
diff changeset
236 public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) {
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
237 // append(new BranchOp(negated ? ConditionFlag.NoOverflow : ConditionFlag.Overflow, label));
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
238 throw GraalInternalError.unimplemented();
8210
c64ecb1ef1a9 Create LIRGenerator.emitOverflowCheckBranch in preparation for emitDeoptimizeOnOverflow removal
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8127
diff changeset
239 }
c64ecb1ef1a9 Create LIRGenerator.emitOverflowCheckBranch in preparation for emitDeoptimizeOnOverflow removal
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8127
diff changeset
240
c64ecb1ef1a9 Create LIRGenerator.emitOverflowCheckBranch in preparation for emitDeoptimizeOnOverflow removal
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8127
diff changeset
241 @Override
13908
8f3cd93813f1 Use branch probability for emitting conditional jump.
Roland Schatz <roland.schatz@oracle.com>
parents: 13907
diff changeset
242 public void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability) {
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
243 emitIntegerTest(left, right);
13907
6fc05ad86490 Remove unused 'negated' arguments.
Roland Schatz <roland.schatz@oracle.com>
parents: 13641
diff changeset
244 append(new BranchOp(Condition.EQ, trueDestination, falseDestination, left.getKind().getStackKind()));
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
245 }
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
246
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
247 private void emitIntegerTest(Value a, Value b) {
12695
4aec62c32a82 Helper functions for identifying numeric kinds.
Roland Schatz <roland.schatz@oracle.com>
parents: 12656
diff changeset
248 assert a.getKind().isNumericInteger();
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
249 if (LIRValueUtil.isVariable(b)) {
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
250 append(new SPARCTestOp(load(b), loadNonConst(a)));
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
251 } else {
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
252 append(new SPARCTestOp(load(a), loadNonConst(b)));
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
253 }
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
254 }
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
255
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
256 @Override
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
257 public Variable emitConditionalMove(Value left, Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
258 boolean mirrored = emitCompare(left, right);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
259 Condition finalCondition = mirrored ? cond.mirror() : cond;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
260
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
261 Variable result = newVariable(trueValue.getKind());
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
262 switch (left.getKind().getStackKind()) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
263 case Int:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
264 case Long:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
265 case Object:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
266 append(new CondMoveOp(result, finalCondition, load(trueValue), loadNonConst(falseValue)));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
267 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
268 case Float:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
269 case Double:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
270 append(new FloatCondMoveOp(result, finalCondition, unorderedIsTrue, load(trueValue), load(falseValue)));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
271 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
272 default:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
273 throw GraalInternalError.shouldNotReachHere("" + left.getKind());
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
274 }
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
275 return result;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
276 }
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
277
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
278 /**
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
279 * This method emits the compare instruction, and may reorder the operands. It returns true if
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
280 * it did so.
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
281 *
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
282 * @param a the left operand of the comparison
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
283 * @param b the right operand of the comparison
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
284 * @return true if the left and right operands were switched, false otherwise
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
285 */
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
286 private boolean emitCompare(Value a, Value b) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
287 Variable left;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
288 Value right;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
289 boolean mirrored;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
290 if (LIRValueUtil.isVariable(b)) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
291 left = load(b);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
292 right = loadNonConst(a);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
293 mirrored = true;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
294 } else {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
295 left = load(a);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
296 right = loadNonConst(b);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
297 mirrored = false;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
298 }
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
299 switch (left.getKind().getStackKind()) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
300 case Int:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
301 append(new CompareOp(ICMP, left, right));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
302 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
303 case Long:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
304 append(new CompareOp(LCMP, left, right));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
305 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
306 case Object:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
307 append(new CompareOp(ACMP, left, right));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
308 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
309 case Float:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
310 append(new CompareOp(FCMP, left, right));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
311 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
312 case Double:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
313 append(new CompareOp(DCMP, left, right));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
314 break;
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
315 default:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
316 throw GraalInternalError.shouldNotReachHere();
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
317 }
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
318 return mirrored;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
319 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
320
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
321 @Override
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
322 public Variable emitIntegerTestMove(Value left, Value right, Value trueValue, Value falseValue) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
323 emitIntegerTest(left, right);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
324 Variable result = newVariable(trueValue.getKind());
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
325 append(new CondMoveOp(result, Condition.EQ, load(trueValue), loadNonConst(falseValue)));
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
326 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
327 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
328
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
329 @Override
9739
4cd4926ec683 rename: RuntimeCallTarget -> ForeignCallLinkage
Doug Simon <doug.simon@oracle.com>
parents: 9613
diff changeset
330 protected void emitForeignCall(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info) {
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
331 long maxOffset = linkage.getMaxCallTargetOffset();
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
332 if (SPARCAssembler.isWordDisp30(maxOffset)) {
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
333 append(new SPARCCall.DirectNearForeignCallOp(linkage, result, arguments, temps, info));
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
334 } else {
10871
c3b09d69dfde SPARC: fixes and more implementation; can now allocate objects
twisti
parents: 10854
diff changeset
335 append(new SPARCCall.DirectFarForeignCallOp(linkage, result, arguments, temps, info));
10854
e1fcdda22831 SPARC: can compile some stubs now but they don't work yet
twisti
parents: 10850
diff changeset
336 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
337 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
338
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
339 @Override
13294
29907e69ae8d rework of switch generation: move code into platform independent SwitchStrategy, add boolean switch strategy
Lukas Stadler <lukas.stadler@jku.at>
parents: 13268
diff changeset
340 protected void emitStrategySwitch(SwitchStrategy strategy, Variable key, LabelRef[] keyTargets, LabelRef defaultTarget) {
13302
094f4ee93977 some javadoc for switch strategies
Lukas Stadler <lukas.stadler@jku.at>
parents: 13294
diff changeset
341 // a temp is needed for loading long and object constants
13294
29907e69ae8d rework of switch generation: move code into platform independent SwitchStrategy, add boolean switch strategy
Lukas Stadler <lukas.stadler@jku.at>
parents: 13268
diff changeset
342 boolean needsTemp = key.getKind() == Kind.Long || key.getKind() == Kind.Object;
29907e69ae8d rework of switch generation: move code into platform independent SwitchStrategy, add boolean switch strategy
Lukas Stadler <lukas.stadler@jku.at>
parents: 13268
diff changeset
343 append(new StrategySwitchOp(strategy, keyTargets, defaultTarget, key, needsTemp ? newVariable(key.getKind()) : Value.ILLEGAL));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
344 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
345
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
346 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
347 protected void emitTableSwitch(int lowKey, LabelRef defaultTarget, LabelRef[] targets, Value key) {
9828
5aedcaed6ccf Initial SPARC control instructions
Morris Meyer <morris.meyer@oracle.com>
parents: 9825
diff changeset
348 // Making a copy of the switch value is necessary because jump table destroys the input
5aedcaed6ccf Initial SPARC control instructions
Morris Meyer <morris.meyer@oracle.com>
parents: 9825
diff changeset
349 // value
5aedcaed6ccf Initial SPARC control instructions
Morris Meyer <morris.meyer@oracle.com>
parents: 9825
diff changeset
350 Variable tmp = emitMove(key);
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
351 append(new TableSwitchOp(lowKey, defaultTarget, targets, tmp, newVariable(target().wordKind)));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
352 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
353
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
354 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
355 public void emitBitCount(Variable result, Value operand) {
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
356 if (operand.getKind().getStackKind() == Kind.Int) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
357 append(new SPARCBitManipulationOp(IPOPCNT, result, asAllocatable(operand), this));
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
358 } else {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
359 append(new SPARCBitManipulationOp(LPOPCNT, result, asAllocatable(operand), this));
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
360 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
361 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
362
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
363 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
364 public void emitBitScanForward(Variable result, Value operand) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
365 append(new SPARCBitManipulationOp(BSF, result, asAllocatable(operand), this));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
366 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
367
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
368 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
369 public void emitBitScanReverse(Variable result, Value operand) {
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
370 if (operand.getKind().getStackKind() == Kind.Int) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
371 append(new SPARCBitManipulationOp(IBSR, result, asAllocatable(operand), this));
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
372 } else {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
373 append(new SPARCBitManipulationOp(LBSR, result, asAllocatable(operand), this));
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
374 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
375 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
376
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
377 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
378 public Value emitMathAbs(Value input) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
379 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
380 append(new BinaryRegConst(DAND, result, asAllocatable(input), Constant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL))));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
381 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
382 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
383
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
384 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
385 public Value emitMathSqrt(Value input) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
386 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
387 append(new SPARCMathIntrinsicOp(SQRT, result, asAllocatable(input)));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
388 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
389 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
390
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
391 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
392 public Value emitMathLog(Value input, boolean base10) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
393 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
394 append(new SPARCMathIntrinsicOp(LOG, result, asAllocatable(input)));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
395 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
396 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
397
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
398 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
399 public Value emitMathCos(Value input) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
400 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
401 append(new SPARCMathIntrinsicOp(COS, result, asAllocatable(input)));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
402 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
403 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
404
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
405 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
406 public Value emitMathSin(Value input) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
407 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
408 append(new SPARCMathIntrinsicOp(SIN, result, asAllocatable(input)));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
409 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
410 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
411
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
412 @Override
11290
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
413 public Value emitMathTan(Value input) {
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
414 Variable result = newVariable(input.getPlatformKind());
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
415 append(new SPARCMathIntrinsicOp(TAN, result, asAllocatable(input)));
686d6d99352c Move MathIntrinsic operations to ArithmeticLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 11289
diff changeset
416 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
417 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
418
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
419 @Override
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
420 public void emitByteSwap(Variable result, Value input) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
421 append(new SPARCByteSwapOp(result, input));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
422 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
423
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
424 @Override
13973
faa6fda7ee36 added Arrays.equals substitutions
twisti
parents: 13908
diff changeset
425 public void emitArrayEquals(Kind kind, Variable result, Value array1, Value array2, Value length) {
13541
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
426 // TODO Auto-generated method stub
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
427 throw GraalInternalError.unimplemented();
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
428 }
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
429
63bb635911ab String.equals method substitution
twisti
parents: 13520
diff changeset
430 @Override
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
431 public Value emitNegate(Value input) {
9825
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
432 Variable result = newVariable(input.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
433 switch (input.getKind().getStackKind()) {
9825
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
434 case Int:
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
435 append(new Op1Stack(INEG, result, input));
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
436 break;
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
437 case Float:
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
438 append(new Op1Stack(FNEG, result, input));
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
439 break;
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
440 case Double:
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
441 append(new Op1Stack(DNEG, result, input));
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
442 break;
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
443 default:
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
444 throw GraalInternalError.shouldNotReachHere();
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
445 }
81d5d8089cda SPARC float arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9817
diff changeset
446 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
447 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
448
11355
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
449 @Override
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
450 public Value emitNot(Value input) {
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
451 Variable result = newVariable(input.getKind());
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
452 switch (input.getKind().getStackKind()) {
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
453 case Int:
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
454 append(new Op1Stack(INOT, result, input));
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
455 break;
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
456 case Long:
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
457 append(new Op1Stack(LNOT, result, input));
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
458 break;
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
459 default:
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
460 throw GraalInternalError.shouldNotReachHere();
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
461 }
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
462 return result;
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
463 }
01269a181628 add bitwise "not" operation
Lukas Stadler <lukas.stadler@jku.at>
parents: 11290
diff changeset
464
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
465 private Variable emitBinary(SPARCArithmetic op, boolean commutative, Value a, Value b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
466 if (isConstant(b)) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
467 return emitBinaryConst(op, commutative, asAllocatable(a), asConstant(b));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
468 } else if (commutative && isConstant(a)) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
469 return emitBinaryConst(op, commutative, asAllocatable(b), asConstant(a));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
470 } else {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
471 return emitBinaryVar(op, commutative, asAllocatable(a), asAllocatable(b));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
472 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
473 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
474
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
475 private Variable emitBinaryConst(SPARCArithmetic op, boolean commutative, AllocatableValue a, Constant b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
476 switch (op) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
477 case IADD:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
478 case LADD:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
479 case ISUB:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
480 case LSUB:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
481 case IAND:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
482 case LAND:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
483 case IOR:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
484 case LOR:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
485 case IXOR:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
486 case LXOR:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
487 case IMUL:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
488 case LMUL:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
489 if (NumUtil.isInt(b.asLong())) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
490 Variable result = newVariable(a.getKind());
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
491 append(new BinaryRegConst(op, result, a, b));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
492 return result;
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
493 }
9814
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
494 break;
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
495 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
496
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
497 return emitBinaryVar(op, commutative, a, asAllocatable(b));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
498 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
499
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
500 private Variable emitBinaryVar(SPARCArithmetic op, boolean commutative, AllocatableValue a, AllocatableValue b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
501 Variable result = newVariable(a.getKind());
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
502 if (commutative) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
503 append(new BinaryCommutative(op, result, a, b));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
504 } else {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
505 append(new BinaryRegReg(op, result, a, b));
9814
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
506 }
e723f9031785 re-architected SPARC assembler to be Fmt class specific, initial arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9739
diff changeset
507 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
508 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
509
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
510 @Override
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
511 public Variable emitAdd(Value a, Value b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
512 switch (a.getKind().getStackKind()) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
513 case Int:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
514 return emitBinary(IADD, true, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
515 case Long:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
516 return emitBinary(LADD, true, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
517 case Float:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
518 return emitBinary(FADD, true, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
519 case Double:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
520 return emitBinary(DADD, true, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
521 default:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
522 throw GraalInternalError.shouldNotReachHere();
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
523 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
524 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
525
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
526 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
527 public Variable emitSub(Value a, Value b) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
528 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
529 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
530 case Int:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
531 append(new Op2Stack(ISUB, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
532 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
533 case Long:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
534 append(new Op2Stack(LSUB, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
535 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
536 case Float:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
537 append(new Op2Stack(FSUB, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
538 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
539 case Double:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
540 append(new Op2Stack(DSUB, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
541 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
542 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
543 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
544 }
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
545 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
546 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
547
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
548 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
549 public Variable emitMul(Value a, Value b) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
550 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
551 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
552 case Int:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
553 append(new BinaryRegReg(IMUL, result, a, loadNonConst(b)));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
554 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
555 case Long:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
556 append(new BinaryRegReg(LMUL, result, a, loadNonConst(b)));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
557 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
558 case Float:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
559 append(new Op2Stack(FMUL, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
560 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
561 case Double:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
562 append(new Op2Stack(DMUL, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
563 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
564 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
565 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
566 }
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
567 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
568 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
569
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
570 @Override
8892
2c0c708a0ad6 Introduce DeoptimizingNode interface
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8643
diff changeset
571 public Value emitDiv(Value a, Value b, DeoptimizingNode deopting) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
572 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
573 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
574 case Int:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
575 append(new BinaryRegReg(IDIV, result, a, loadNonConst(b)));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
576 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
577 case Long:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
578 append(new BinaryRegReg(LDIV, result, a, loadNonConst(b)));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
579 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
580 case Float:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
581 append(new Op2Stack(FDIV, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
582 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
583 case Double:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
584 append(new Op2Stack(DDIV, result, a, loadNonConst(b)));
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
585 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
586 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
587 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
588 }
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
589 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
590 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
591
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
592 @Override
8892
2c0c708a0ad6 Introduce DeoptimizingNode interface
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8643
diff changeset
593 public Value emitRem(Value a, Value b, DeoptimizingNode deopting) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
594 LIRFrameState state = state(deopting);
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
595 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
596 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
597 case Int:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
598 append(new RemOp(IREM, result, a, loadNonConst(b), state, this));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
599 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
600 case Long:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
601 append(new RemOp(LREM, result, a, loadNonConst(b), state, this));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
602 break;
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
603 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
604 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
605 }
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
606 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
607 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
608
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
609 @Override
8892
2c0c708a0ad6 Introduce DeoptimizingNode interface
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8643
diff changeset
610 public Value emitUDiv(Value a, Value b, DeoptimizingNode deopting) {
12503
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
611 // LIRFrameState state = state(deopting);
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
612 switch (a.getKind().getStackKind()) {
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
613 case Int:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
614 // emitDivRem(IUDIV, a, b, state);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
615 // return emitMove(RAX_I);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
616 case Long:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
617 // emitDivRem(LUDIV, a, b, state);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
618 // return emitMove(RAX_L);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
619 default:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
620 throw GraalInternalError.shouldNotReachHere();
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
621 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
622 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
623
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
624 @Override
8892
2c0c708a0ad6 Introduce DeoptimizingNode interface
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8643
diff changeset
625 public Value emitURem(Value a, Value b, DeoptimizingNode deopting) {
12503
d7f8dd4fe876 minor reformatting based on 'mx eclipseformat'
Doug Simon <doug.simon@oracle.com>
parents: 12429
diff changeset
626 // LIRFrameState state = state(deopting);
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
627 switch (a.getKind().getStackKind()) {
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
628 case Int:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
629 // emitDivRem(IUREM, a, b, state);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
630 // return emitMove(RDX_I);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
631 case Long:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
632 // emitDivRem(LUREM, a, b, state);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
633 // return emitMove(RDX_L);
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
634 default:
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
635 throw GraalInternalError.shouldNotReachHere();
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
636 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
637 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
638
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
639 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
640 public Variable emitAnd(Value a, Value b) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
641 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
642 switch (a.getKind().getStackKind()) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
643 case Int:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
644 append(new Op2Stack(IAND, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
645 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
646 case Long:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
647 append(new Op2Stack(LAND, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
648 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
649
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
650 default:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
651 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
652 }
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
653 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
654 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
655
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
656 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
657 public Variable emitOr(Value a, Value b) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
658 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
659 switch (a.getKind().getStackKind()) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
660 case Int:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
661 append(new Op2Stack(IOR, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
662 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
663 case Long:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
664 append(new Op2Stack(LOR, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
665 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
666 default:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
667 throw GraalInternalError.shouldNotReachHere("missing: " + a.getKind());
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
668 }
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
669 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
670 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
671
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
672 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
673 public Variable emitXor(Value a, Value b) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
674 Variable result = newVariable(a.getKind());
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
675 switch (a.getKind().getStackKind()) {
9829
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
676 case Int:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
677 append(new Op2Stack(IXOR, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
678 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
679 case Long:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
680 append(new Op2Stack(LXOR, result, a, loadNonConst(b)));
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
681 break;
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
682 default:
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
683 throw GraalInternalError.shouldNotReachHere();
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
684 }
04911dff1c66 SPARC logic and shift operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9828
diff changeset
685 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
686 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
687
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
688 private Variable emitShift(SPARCArithmetic op, Value a, Value b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
689 Variable result = newVariable(a.getPlatformKind());
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
690 AllocatableValue input = asAllocatable(a);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
691 if (isConstant(b)) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
692 append(new BinaryRegConst(op, result, input, asConstant(b)));
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
693 } else {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
694 append(new BinaryRegReg(op, result, input, b));
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
695 }
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
696 return result;
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
697 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
698
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
699 @Override
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
700 public Variable emitShl(Value a, Value b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
701 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
702 case Int:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
703 return emitShift(ISHL, a, b);
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
704 case Long:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
705 return emitShift(LSHL, a, b);
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
706 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
707 throw GraalInternalError.shouldNotReachHere();
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
708 }
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
709 }
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
710
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
711 @Override
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
712 public Variable emitShr(Value a, Value b) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
713 switch (a.getKind().getStackKind()) {
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
714 case Int:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
715 return emitShift(ISHR, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
716 case Long:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
717 return emitShift(LSHR, a, b);
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
718 default:
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
719 throw GraalInternalError.shouldNotReachHere();
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
720 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
721 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
722
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
723 @Override
10792
7a8d6ba83a04 SPARC: fixes and more stuff works
twisti
parents: 10694
diff changeset
724 public Variable emitUShr(Value a, Value b) {
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
725 switch (a.getKind().getStackKind()) {
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
726 case Int:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
727 return emitShift(IUSHR, a, b);
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
728 case Long:
11233
5a9d68c3a7d7 SPARC: a lot of fixes and more
twisti
parents: 10871
diff changeset
729 return emitShift(LUSHR, a, b);
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
730 default:
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
731 throw GraalInternalError.shouldNotReachHere();
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
732 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
733 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
734
14003
0c38906450a0 Make conversion from Stamp to PlatformKind extensible by backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
735 private AllocatableValue emitConvertMove(PlatformKind kind, AllocatableValue input) {
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
736 Variable result = newVariable(kind);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
737 emitMove(result, input);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
738 return result;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
739 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
740
14003
0c38906450a0 Make conversion from Stamp to PlatformKind extensible by backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
741 private AllocatableValue emitConvert2Op(PlatformKind kind, SPARCArithmetic op, AllocatableValue input) {
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
742 Variable result = newVariable(kind);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
743 append(new Unary2Op(op, result, input));
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
744 return result;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
745 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
746
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
747 @Override
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
748 public Value emitFloatConvert(FloatConvert op, Value inputVal) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
749 AllocatableValue input = asAllocatable(inputVal);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
750 switch (op) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
751 case D2F:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
752 return emitConvert2Op(Kind.Float, D2F, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
753 case D2I:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
754 return emitConvert2Op(Kind.Int, D2I, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
755 case D2L:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
756 return emitConvert2Op(Kind.Long, D2L, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
757 case F2D:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
758 return emitConvert2Op(Kind.Double, F2D, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
759 case F2I:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
760 return emitConvert2Op(Kind.Int, F2I, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
761 case F2L:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
762 return emitConvert2Op(Kind.Long, F2L, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
763 case I2D:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
764 return emitConvert2Op(Kind.Double, I2D, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
765 case I2F:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
766 return emitConvert2Op(Kind.Float, I2F, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
767 case L2D:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
768 return emitConvert2Op(Kind.Double, L2D, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
769 case L2F:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
770 return emitConvert2Op(Kind.Float, L2F, input);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
771 default:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
772 throw GraalInternalError.shouldNotReachHere();
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
773 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
774 }
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
775
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
776 @Override
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
777 public Value emitNarrow(Value inputVal, int bits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
778 if (inputVal.getKind() == Kind.Long && bits <= 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
779 return emitConvert2Op(Kind.Int, L2I, asAllocatable(inputVal));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
780 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
781 return inputVal;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
782 }
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
783 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
784
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
785 @Override
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
786 public Value emitSignExtend(Value inputVal, int fromBits, int toBits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
787 assert fromBits <= toBits && toBits <= 64;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
788 if (fromBits == toBits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
789 return inputVal;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
790 } else if (toBits > 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
791 // sign extend to 64 bits
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
792 if (fromBits == 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
793 return emitConvert2Op(Kind.Long, I2L, asAllocatable(inputVal));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
794 } else if (fromBits < 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
795 // TODO implement direct x2L sign extension conversions
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
796 Value intVal = emitSignExtend(inputVal, fromBits, 32);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
797 return emitSignExtend(intVal, 32, toBits);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
798 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
799 throw GraalInternalError.unimplemented("unsupported sign extension (" + fromBits + " bit -> " + toBits + " bit)");
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
800 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
801 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
802 // sign extend to 32 bits (smaller values are internally represented as 32 bit values)
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
803 switch (fromBits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
804 case 8:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
805 return emitConvert2Op(Kind.Int, I2B, asAllocatable(inputVal));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
806 case 16:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
807 return emitConvert2Op(Kind.Int, I2S, asAllocatable(inputVal));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
808 case 32:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
809 return inputVal;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
810 default:
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
811 throw GraalInternalError.unimplemented("unsupported sign extension (" + fromBits + " bit -> " + toBits + " bit)");
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
812 }
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
813 }
14000
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
814 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
815
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
816 @Override
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
817 public Value emitZeroExtend(Value inputVal, int fromBits, int toBits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
818 assert fromBits <= toBits && toBits <= 64;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
819 if (fromBits == toBits) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
820 return inputVal;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
821 } else if (fromBits > 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
822 assert inputVal.getKind() == Kind.Long;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
823 Variable result = newVariable(Kind.Long);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
824 long mask = IntegerStamp.defaultMask(fromBits);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
825 append(new BinaryRegConst(SPARCArithmetic.LAND, result, asAllocatable(inputVal), Constant.forLong(mask)));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
826 return result;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
827 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
828 assert inputVal.getKind() == Kind.Int;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
829 Variable result = newVariable(Kind.Int);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
830 int mask = (int) IntegerStamp.defaultMask(fromBits);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
831 append(new BinaryRegConst(SPARCArithmetic.IAND, result, asAllocatable(inputVal), Constant.forInt(mask)));
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
832 if (toBits > 32) {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
833 Variable longResult = newVariable(Kind.Long);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
834 emitMove(longResult, result);
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
835 return longResult;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
836 } else {
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
837 return result;
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
838 }
958c99d0790c Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents: 13973
diff changeset
839 }
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
840 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
841
14003
0c38906450a0 Make conversion from Stamp to PlatformKind extensible by backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
842 @Override
0c38906450a0 Make conversion from Stamp to PlatformKind extensible by backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
843 public AllocatableValue emitReinterpret(PlatformKind to, Value inputVal) {
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
844 Kind from = inputVal.getKind();
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
845 AllocatableValue input = asAllocatable(inputVal);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
846
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
847 // These cases require a move between CPU and FPU registers:
14003
0c38906450a0 Make conversion from Stamp to PlatformKind extensible by backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 14000
diff changeset
848 switch ((Kind) to) {
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
849 case Int:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
850 switch (from) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
851 case Float:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
852 case Double:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
853 return emitConvert2Op(to, MOV_F2I, input);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
854 }
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
855 break;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
856 case Long:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
857 switch (from) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
858 case Float:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
859 case Double:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
860 return emitConvert2Op(to, MOV_D2L, input);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
861 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
862 break;
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
863 case Float:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
864 switch (from) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
865 case Int:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
866 case Long:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
867 return emitConvert2Op(to, MOV_I2F, input);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
868 }
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
869 break;
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
870 case Double:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
871 switch (from) {
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
872 case Int:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
873 case Long:
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
874 return emitConvert2Op(to, MOV_L2D, input);
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
875 }
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
876 break;
9817
26960d32552c SPARC integer arithmetic
Morris Meyer <morris.meyer@oracle.com>
parents: 9816
diff changeset
877 }
12656
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
878
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
879 // Otherwise, just emit an ordinary move instruction.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
880 // Instructions that move or generate 32-bit register values also set the upper 32
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
881 // bits of the register to zero.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
882 // Consequently, there is no need for a special zero-extension move.
9334392ed279 Refactor ConvertNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 12503
diff changeset
883 return emitConvertMove(to, input);
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
884 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
885
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
886 @Override
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
887 public void emitMembar(int barriers) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
888 int necessaryBarriers = target().arch.requiredBarriers(barriers);
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
889 if (target().isMP && necessaryBarriers != 0) {
9845
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
890 append(new MembarOp(necessaryBarriers));
204e8f3209e9 SPARCMacroAssembler synthetic instructions and SPARCTestOp
Morris Meyer <morris.meyer@oracle.com>
parents: 9843
diff changeset
891 }
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
892 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
893
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
894 @Override
13641
5a9afbf72714 Add a speculation oop for uncommon trap deoptimization. Save it in the SpeculationLog during deoptimization.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13541
diff changeset
895 public void emitDeoptimize(Value actionAndReason, Value speculation, DeoptimizingNode deopting) {
9831
705aca4ebf2f SPARC array, load / store and compare operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9829
diff changeset
896 append(new ReturnOp(Value.ILLEGAL));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
897 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
898
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
899 @Override
10850
e7679ec4f27f Lower CAS nodes to their lowered versions
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10792
diff changeset
900 public void visitCompareAndSwap(LoweredCompareAndSwapNode i, Value address) {
9816
4e9854086532 Initial SPARC compilation test
Morris Meyer <morris.meyer@oracle.com>
parents: 9814
diff changeset
901 throw new InternalError("NYI");
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
902 }
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
903
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
904 @Override
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
905 public void visitBreakpointNode(BreakpointNode node) {
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
906 JavaType[] sig = new JavaType[node.arguments().size()];
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
907 for (int i = 0; i < sig.length; i++) {
12429
5124eeec1a7b split HotSpotRuntime into separate provider implementations
Doug Simon <doug.simon@oracle.com>
parents: 12363
diff changeset
908 sig[i] = node.arguments().get(i).stamp().javaType(getMetaAccess());
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
909 }
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
910
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
911 Value[] parameters = visitInvokeArguments(frameMap.registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments());
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
912 append(new SPARCBreakpointOp(parameters));
7743
7732a91e5f6d Added more skeleton code to SPARC projects.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7740
diff changeset
913 }
8127
3d41998c30de Create new way of handling unwind that recalculates rbp from rsp. Remove unused instanceof slow path stub.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7936
diff changeset
914
3d41998c30de Create new way of handling unwind that recalculates rbp from rsp. Remove unused instanceof slow path stub.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7936
diff changeset
915 @Override
3d41998c30de Create new way of handling unwind that recalculates rbp from rsp. Remove unused instanceof slow path stub.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7936
diff changeset
916 public void emitUnwind(Value operand) {
9816
4e9854086532 Initial SPARC compilation test
Morris Meyer <morris.meyer@oracle.com>
parents: 9814
diff changeset
917 throw new InternalError("NYI");
8390
acc24060b64f Use implicit null checks for all null checks
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8333
diff changeset
918 }
acc24060b64f Use implicit null checks for all null checks
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8333
diff changeset
919
acc24060b64f Use implicit null checks for all null checks
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8333
diff changeset
920 @Override
8892
2c0c708a0ad6 Introduce DeoptimizingNode interface
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8643
diff changeset
921 public void emitNullCheck(ValueNode v, DeoptimizingNode deopting) {
9831
705aca4ebf2f SPARC array, load / store and compare operations
Morris Meyer <morris.meyer@oracle.com>
parents: 9829
diff changeset
922 assert v.kind() == Kind.Object;
9846
91a1041ec905 SPARCLIRGenerator, sqrt, condition move, breakpoint op, partial bit ops
Morris Meyer <morris.meyer@oracle.com>
parents: 9845
diff changeset
923 append(new NullCheckOp(load(operand(v)), state(deopting)));
8127
3d41998c30de Create new way of handling unwind that recalculates rbp from rsp. Remove unused instanceof slow path stub.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7936
diff changeset
924 }
9003
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8892
diff changeset
925
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8892
diff changeset
926 @Override
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8892
diff changeset
927 public void visitInfopointNode(InfopointNode i) {
9816
4e9854086532 Initial SPARC compilation test
Morris Meyer <morris.meyer@oracle.com>
parents: 9814
diff changeset
928 throw new InternalError("NYI");
9003
a8fea2979e63 eager infopoint mode (fka debug mode)
Michael Haupt <michael.haupt@oracle.com>
parents: 8892
diff changeset
929 }
7740
5f8101629080 Add projects and skeletons for SPARC port.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
930 }