annotate graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java @ 17116:dced35fd40f7

[SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 16 Sep 2014 15:36:00 -0700
parents fe935dbf9863
children 44a96c7413a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
1 /*
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
4 *
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
8 *
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
13 * accompanied this code).
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
14 *
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
18 *
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
21 * questions.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
22 */
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.lir.sparc;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
24
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
25 import static com.oracle.graal.api.code.ValueUtil.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
26 import static com.oracle.graal.compiler.common.UnsafeAccess.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
27 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
28 import static com.oracle.graal.sparc.SPARC.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
29 import static com.oracle.graal.asm.sparc.SPARCAssembler.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
30 import static com.oracle.graal.asm.sparc.SPARCAssembler.CC.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
31
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
32 import java.lang.reflect.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
33
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.api.code.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.api.meta.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.asm.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
37 import com.oracle.graal.asm.sparc.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Cmp;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
39 import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Mov;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
40 import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Nop;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
41 import com.oracle.graal.lir.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
42 import com.oracle.graal.lir.asm.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
43 import com.oracle.graal.lir.gen.*;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
44
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
45 /**
17110
fe935dbf9863 Remove unused imports
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17109
diff changeset
46 * Emits code which compares two arrays of the same length.
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
47 */
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
48 @Opcode("ARRAY_EQUALS")
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
49 public class SPARCArrayEqualsOp extends SPARCLIRInstruction {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
50
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
51 private final Kind kind;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
52 private final int arrayBaseOffset;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
53 private final int arrayIndexScale;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
54
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
55 @Def({REG}) protected Value resultValue;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
56 @Alive({REG}) protected Value array1Value;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
57 @Alive({REG}) protected Value array2Value;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
58 @Alive({REG}) protected Value lengthValue;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
59 @Temp({REG}) protected Value temp1;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
60 @Temp({REG}) protected Value temp2;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
61 @Temp({REG}) protected Value temp3;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
62 @Temp({REG}) protected Value temp4;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
63 @Temp({REG}) protected Value temp5;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
64
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
65 public SPARCArrayEqualsOp(LIRGeneratorTool tool, Kind kind, Value result, Value array1, Value array2, Value length) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
66 this.kind = kind;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
67
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
68 Class<?> arrayClass = Array.newInstance(kind.toJavaClass(), 0).getClass();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
69 this.arrayBaseOffset = unsafe.arrayBaseOffset(arrayClass);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
70 this.arrayIndexScale = unsafe.arrayIndexScale(arrayClass);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
71
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
72 this.resultValue = result;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
73 this.array1Value = array1;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
74 this.array2Value = array2;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
75 this.lengthValue = length;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
76
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
77 // Allocate some temporaries.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
78 this.temp1 = tool.newVariable(LIRKind.derivedReference(tool.target().wordKind));
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
79 this.temp2 = tool.newVariable(LIRKind.derivedReference(tool.target().wordKind));
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
80 this.temp3 = tool.newVariable(LIRKind.value(tool.target().wordKind));
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
81 this.temp4 = tool.newVariable(LIRKind.value(tool.target().wordKind));
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
82 this.temp5 = tool.newVariable(LIRKind.value(tool.target().wordKind));
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
83 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
84
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
85 @Override
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
86 public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
87 Register result = asRegister(resultValue);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
88 Register array1 = asRegister(temp1);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
89 Register array2 = asRegister(temp2);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
90 Register length = asRegister(temp3);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
91
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
92 Label trueLabel = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
93 Label falseLabel = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
94 Label done = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
95
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
96 // Load array base addresses.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
97 new Add(asObjectReg(array1Value), arrayBaseOffset, array1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
98 new Add(asObjectReg(array2Value), arrayBaseOffset, array2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
99
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
100 // Get array length in bytes.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
101 new Mulx(asIntReg(lengthValue), arrayIndexScale, length).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
102 new Mov(length, result).emit(masm); // copy
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
103
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
104 emit8ByteCompare(masm, result, array1, array2, length, trueLabel, falseLabel);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
105 emitTailCompares(masm, result, array1, array2, trueLabel, falseLabel);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
106
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
107 // Return true
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
108 masm.bind(trueLabel);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
109 new Mov(1, result).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
110 new Bpa(done).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
111 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
112
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
113 // Return false
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
114 masm.bind(falseLabel);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
115 new Mov(g0, result).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
116
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
117 // That's it
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
118 masm.bind(done);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
119 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
120
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
121 /**
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
122 * Vector size used in {@link #emit8ByteCompare}.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
123 */
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
124 private static final int VECTOR_SIZE = 8;
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
125
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
126 /**
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
127 * Emits code that uses 8-byte vector compares.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
128 */
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
129 private void emit8ByteCompare(SPARCMacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
130 Label loop = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
131 Label compareTail = new Label();
17116
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
132 // new Ldx(new SPARCAddress(o6, 3), g0).emit(masm);
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
133 Register tempReg1 = asRegister(temp4);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
134 Register tempReg2 = asRegister(temp5);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
135 new And(result, VECTOR_SIZE - 1, result).emit(masm); // tail count (in bytes)
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
136 new Andcc(length, ~(VECTOR_SIZE - 1), length).emit(masm); // vector count (in bytes)
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
137 new Bpe(CC.Xcc, compareTail).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
138 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
139
17116
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
140 Label compareTailCorrectVectorEnd = new Label();
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
141 new Sub(length, VECTOR_SIZE, length).emit(masm);
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
142 new Add(array1, length, array1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
143 new Add(array2, length, array2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
144 new Sub(g0, length, length).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
145
17116
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
146 // Compare the last element first
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
147 new Ldx(new SPARCAddress(array1, 0), tempReg1).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
148 new Ldx(new SPARCAddress(array2, 0), tempReg2).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
149 new Cmp(tempReg1, tempReg2).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
150 new Bpne(Xcc, true, false, falseLabel).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
151 new Nop().emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
152 new Bpr(RCondition.Rc_z, false, false, length, compareTailCorrectVectorEnd).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
153 new Nop().emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
154
17110
fe935dbf9863 Remove unused imports
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17109
diff changeset
155 // Load the first value from array 1 (Later done in back branch delay-slot)
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
156 new Ldx(new SPARCAddress(array1, length), tempReg1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
157 masm.bind(loop);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
158 new Ldx(new SPARCAddress(array2, length), tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
159 new Cmp(tempReg1, tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
160 new Bpne(Xcc, false, false, falseLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
161 // Delay slot, not annul, add for next iteration
17116
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
162 new Addcc(length, VECTOR_SIZE, length).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
163 new Bpne(Xcc, true, true, loop).emit(masm); // Annul, to prevent access past the array
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
164 new Ldx(new SPARCAddress(array1, length), tempReg1).emit(masm); // Load in delay slot
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
165
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
166 // Tail count zero, therefore we can go to the end
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
167 new Bpr(RCondition.Rc_z, true, true, result, trueLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
168 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
169
17116
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
170 masm.bind(compareTailCorrectVectorEnd);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
171 // Correct the array pointers
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
172 new Add(array1, VECTOR_SIZE, array1).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
173 new Add(array2, VECTOR_SIZE, array2).emit(masm);
dced35fd40f7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 17110
diff changeset
174
17109
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
175 masm.bind(compareTail);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
176 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
177
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
178 /**
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
179 * Emits code to compare the remaining 1 to 4 bytes.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
180 */
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
181 private void emitTailCompares(SPARCMacroAssembler masm, Register result, Register array1, Register array2, Label trueLabel, Label falseLabel) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
182 Label compare2Bytes = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
183 Label compare1Byte = new Label();
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
184
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
185 Register tempReg1 = asRegister(temp3);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
186 Register tempReg2 = asRegister(temp4);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
187
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
188 if (kind.getByteCount() <= 4) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
189 // Compare trailing 4 bytes, if any.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
190 new Cmp(result, 4).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
191 new Bpl(Xcc, false, false, compare2Bytes).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
192 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
193 new Lduw(new SPARCAddress(array1, 0), tempReg1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
194 new Lduw(new SPARCAddress(array2, 0), tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
195 new Cmp(tempReg1, tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
196
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
197 new Bpne(Xcc, false, false, falseLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
198 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
199
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
200 if (kind.getByteCount() <= 2) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
201 // Move array pointers forward.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
202 new Add(array1, 4, array1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
203 new Add(array2, 4, array2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
204 new Sub(result, 4, result).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
205
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
206 // Compare trailing 2 bytes, if any.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
207 masm.bind(compare2Bytes);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
208
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
209 new Cmp(result, 2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
210 new Bpl(Xcc, false, true, compare1Byte).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
211 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
212 new Lduh(new SPARCAddress(array1, 0), tempReg1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
213 new Lduh(new SPARCAddress(array2, 0), tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
214 new Cmp(tempReg1, tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
215 new Bpne(Xcc, false, true, falseLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
216 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
217
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
218 // The one-byte tail compare is only required for boolean and byte arrays.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
219 if (kind.getByteCount() <= 1) {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
220 // Move array pointers forward before we compare the last trailing byte.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
221 new Add(array1, 2, array1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
222 new Add(array2, 2, array2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
223 new Sub(result, 2, result).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
224
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
225 // Compare trailing byte, if any.
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
226 masm.bind(compare1Byte);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
227 new Cmp(result, 1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
228 new Bpne(Xcc, trueLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
229 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
230 new Ldub(new SPARCAddress(array1, 0), tempReg1).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
231 new Ldub(new SPARCAddress(array2, 0), tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
232 new Cmp(tempReg1, tempReg2).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
233 new Bpne(Xcc, falseLabel).emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
234 new Nop().emit(masm);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
235 } else {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
236 masm.bind(compare1Byte);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
237 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
238 } else {
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
239 masm.bind(compare2Bytes);
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
240 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
241 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
242 }
1a92d77a851b [SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff changeset
243 }