annotate graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotMove.java @ 21526:1da7aef31a08

created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Tue, 19 May 2015 23:16:07 +0200
parents f85738837dae
children 93c50cefb9e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
1 /*
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
4 *
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
8 *
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
13 * accompanied this code).
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
14 *
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
18 *
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
21 * questions.
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
22 */
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.hotspot.sparc;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
24
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
25 import static com.oracle.graal.api.code.ValueUtil.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
26 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
27
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.api.code.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.api.meta.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.asm.*;
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
31 import com.oracle.graal.asm.sparc.*;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.asm.sparc.SPARCAssembler.Annul;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.asm.sparc.SPARCAssembler.BranchPredict;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.asm.sparc.SPARCAssembler.CC;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.asm.sparc.SPARCAssembler.RCondition;
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
37 import com.oracle.graal.asm.sparc.SPARCMacroAssembler.ScratchRegister;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.compiler.common.*;
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
39 import com.oracle.graal.hotspot.*;
21526
1da7aef31a08 created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21350
diff changeset
40 import com.oracle.graal.hotspot.jvmci.*;
1da7aef31a08 created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21350
diff changeset
41 import com.oracle.graal.hotspot.jvmci.HotSpotVMConfig.*;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
42 import com.oracle.graal.lir.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
43 import com.oracle.graal.lir.StandardOp.MoveOp;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
44 import com.oracle.graal.lir.asm.*;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
45 import com.oracle.graal.lir.sparc.*;
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
46 import com.oracle.graal.sparc.*;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
47
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
48 public class SPARCHotSpotMove {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
49
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
50 public static final class HotSpotLoadConstantOp extends SPARCLIRInstruction implements MoveOp {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
51 public static final LIRInstructionClass<HotSpotLoadConstantOp> TYPE = LIRInstructionClass.create(HotSpotLoadConstantOp.class);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
52
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
53 @Def({REG, STACK}) private AllocatableValue result;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
54 private final JavaConstant input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
55
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
56 public HotSpotLoadConstantOp(AllocatableValue result, JavaConstant input) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
57 super(TYPE);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
58 this.result = result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
59 this.input = input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
60 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
61
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
62 @Override
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
63 public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
64 if (isStackSlot(result)) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
65 StackSlot ss = asStackSlot(result);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
66 try (ScratchRegister s1 = masm.getScratchRegister()) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
67 Register sr1 = s1.getRegister();
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
68 loadToRegister(crb, masm, sr1.asValue(), input);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
69 try (ScratchRegister s2 = masm.getScratchRegister()) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
70 Register sr2 = s2.getRegister();
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
71 int stackBias = HotSpotGraalRuntime.runtime().getConfig().stackBias;
21350
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
72 int offset = crb.frameMap.offsetForStackSlot(ss);
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
73 new SPARCMacroAssembler.Setx(offset + stackBias, sr2).emit(masm);
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
74 SPARCAddress addr = new SPARCAddress(SPARC.sp, sr2);
21350
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
75 Kind resultKind = (Kind) result.getPlatformKind();
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
76 switch (resultKind) {
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
77 case Int:
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
78 masm.stw(sr1, addr);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
79 break;
21350
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
80 case Long:
f85738837dae [SPARC] Use proper stackslot offset in SPARCHotSpotMove
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21348
diff changeset
81 case Object:
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
82 masm.stx(sr1, addr);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
83 break;
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
84 default:
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
85 throw GraalInternalError.shouldNotReachHere();
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
86 }
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
87 }
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
88 }
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
89 } else {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
90 loadToRegister(crb, masm, result, input);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
91 }
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
92 }
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
93
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
94 private static void loadToRegister(CompilationResultBuilder crb, SPARCMacroAssembler masm, AllocatableValue dest, JavaConstant constant) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
95 assert isRegister(dest);
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
96 if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(constant)) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
97 masm.mov(0, asRegister(dest));
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
98 } else if (constant instanceof HotSpotObjectConstant) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
99 boolean compressed = ((HotSpotObjectConstant) constant).isCompressed();
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
100 if (crb.target.inlineObjects) {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
101 crb.recordInlineDataInCode(constant);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
102 if (compressed) {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
103 masm.sethi(0xDEADDEAD >>> 10, asRegister(dest));
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
104 masm.add(asRegister(dest), 0xAD & 0x3F, asRegister(dest));
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
105 } else {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
106 new SPARCMacroAssembler.Setx(0xDEADDEADDEADDEADL, asRegister(dest), true).emit(masm);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
107 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
108 } else {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
109 GraalInternalError.unimplemented();
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
110 }
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
111 } else if (constant instanceof HotSpotMetaspaceConstant) {
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
112 assert constant.getKind() == Kind.Int || constant.getKind() == Kind.Long;
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
113 boolean compressed = constant.getKind() == Kind.Int;
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
114 boolean isImmutable = GraalOptions.ImmutableCode.getValue();
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
115 boolean generatePIC = GraalOptions.GeneratePIC.getValue();
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
116 crb.recordInlineDataInCode(constant);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
117 if (compressed) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
118 if (isImmutable && generatePIC) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
119 GraalInternalError.unimplemented();
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
120 } else {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
121 new SPARCMacroAssembler.Setx(constant.asInt(), asRegister(dest), true).emit(masm);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
122 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
123 } else {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
124 if (isImmutable && generatePIC) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
125 GraalInternalError.unimplemented();
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
126 } else {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
127 new SPARCMacroAssembler.Setx(constant.asLong(), asRegister(dest), true).emit(masm);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
128 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
129 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
130 } else {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
131 SPARCMove.move(crb, masm, dest, constant, SPARCDelayedControlTransfer.DUMMY);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
132 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
133 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
134
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
135 public Value getInput() {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
136 return input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
137 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
138
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
139 public AllocatableValue getResult() {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
140 return result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
141 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
142 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
143
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
144 public static final class CompressPointer extends SPARCLIRInstruction {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
145 public static final LIRInstructionClass<CompressPointer> TYPE = LIRInstructionClass.create(CompressPointer.class);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
146
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
147 private final CompressEncoding encoding;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
148 private final boolean nonNull;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
149
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
150 @Def({REG}) protected AllocatableValue result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
151 @Use({REG}) protected AllocatableValue input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
152 @Alive({REG, ILLEGAL}) protected AllocatableValue baseRegister;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
153
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
154 public CompressPointer(AllocatableValue result, AllocatableValue input, AllocatableValue baseRegister, CompressEncoding encoding, boolean nonNull) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
155 super(TYPE);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
156 this.result = result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
157 this.input = input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
158 this.baseRegister = baseRegister;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
159 this.encoding = encoding;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
160 this.nonNull = nonNull;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
161 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
162
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
163 @Override
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
164 public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
165 SPARCMove.move(crb, masm, result, input, SPARCDelayedControlTransfer.DUMMY);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
166
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
167 Register resReg = asRegister(result);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
168 if (encoding.base != 0) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
169 Register baseReg = asRegister(baseRegister);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
170 if (!nonNull) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
171 masm.cmp(resReg, baseReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
172 masm.movcc(ConditionFlag.Equal, CC.Xcc, baseReg, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
173 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
174 masm.sub(resReg, baseReg, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
175 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
176
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
177 if (encoding.shift != 0) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
178 masm.srlx(resReg, encoding.shift, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
179 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
180 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
181 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
182
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
183 public static final class UncompressPointer extends SPARCLIRInstruction {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
184 public static final LIRInstructionClass<UncompressPointer> TYPE = LIRInstructionClass.create(UncompressPointer.class);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
185
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
186 private final CompressEncoding encoding;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
187 private final boolean nonNull;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
188
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
189 @Def({REG}) protected AllocatableValue result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
190 @Use({REG}) protected AllocatableValue input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
191 @Alive({REG, ILLEGAL}) protected AllocatableValue baseRegister;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
192
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
193 public UncompressPointer(AllocatableValue result, AllocatableValue input, AllocatableValue baseRegister, CompressEncoding encoding, boolean nonNull) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
194 super(TYPE);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
195 this.result = result;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
196 this.input = input;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
197 this.baseRegister = baseRegister;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
198 this.encoding = encoding;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
199 this.nonNull = nonNull;
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
200 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
201
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
202 @Override
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
203 public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
204 SPARCMove.move(crb, masm, result, input, SPARCDelayedControlTransfer.DUMMY);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
205
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
206 Register resReg = asRegister(result);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
207 if (encoding.shift != 0) {
21348
d24e4f349cbc [SPARC] Implement load constant directly to stack
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 21255
diff changeset
208 masm.sll(resReg, encoding.shift, resReg);
21255
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
209 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
210
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
211 if (encoding.base != 0) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
212 if (nonNull) {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
213 masm.add(resReg, asRegister(baseRegister), resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
214 } else {
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
215 masm.cmp(resReg, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
216
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
217 Label done = new Label();
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
218 masm.bpr(RCondition.Rc_nz, Annul.ANNUL, done, BranchPredict.PREDICT_TAKEN, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
219 masm.add(asRegister(baseRegister), resReg, resReg);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
220 masm.bind(done);
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
221 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
222 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
223 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
224 }
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
225
ccddbb1409d2 [SPARC] Implement Narrow OOPS
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
226 }