Mercurial > hg > truffle
annotate graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java @ 21673:5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 02 Jun 2015 22:11:52 +0200 |
parents | 48c1ebd24120 |
children | 6df25b1418be |
rev | line source |
---|---|
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
1 /* |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
17144
diff
changeset
|
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. |
17109
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 |
21556
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21541
diff
changeset
|
25 import com.oracle.jvmci.code.Register; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21541
diff
changeset
|
26 import com.oracle.jvmci.meta.LIRKind; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21541
diff
changeset
|
27 import com.oracle.jvmci.meta.Value; |
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21541
diff
changeset
|
28 import com.oracle.jvmci.meta.Kind; |
21673
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
29 import com.oracle.jvmci.sparc.SPARC.*; |
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
30 |
21556
48c1ebd24120
renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21541
diff
changeset
|
31 import static com.oracle.jvmci.code.ValueUtil.*; |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
32 import static com.oracle.graal.asm.sparc.SPARCAssembler.Annul.*; |
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
33 import static com.oracle.graal.asm.sparc.SPARCAssembler.BranchPredict.*; |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
34 import static com.oracle.graal.asm.sparc.SPARCAssembler.CC.*; |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
35 import static com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag.*; |
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
36 import static com.oracle.graal.asm.sparc.SPARCAssembler.RCondition.*; |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
37 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; |
21541
5e868236654f
moved UnsafeAccess to com.oracle.jvmci.common (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21405
diff
changeset
|
38 import static com.oracle.jvmci.common.UnsafeAccess.*; |
21673
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
39 import static com.oracle.jvmci.sparc.SPARC.*; |
5024c80224c7
moved com.oracle.graal.[amd64|sparc] to com.oracle.jvmci.[amd64|sparc] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents:
21556
diff
changeset
|
40 import static com.oracle.jvmci.sparc.SPARC.CPUFeature.*; |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
41 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
42 import java.lang.reflect.*; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
43 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
44 import com.oracle.graal.asm.*; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
45 import com.oracle.graal.asm.sparc.*; |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
46 import com.oracle.graal.asm.sparc.SPARCAssembler.CC; |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
47 import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag; |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
48 import com.oracle.graal.lir.*; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
49 import com.oracle.graal.lir.asm.*; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
50 import com.oracle.graal.lir.gen.*; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
51 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
52 /** |
17110
fe935dbf9863
Remove unused imports
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17109
diff
changeset
|
53 * 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
|
54 */ |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
55 @Opcode("ARRAY_EQUALS") |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
17144
diff
changeset
|
56 public final class SPARCArrayEqualsOp extends SPARCLIRInstruction { |
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
17144
diff
changeset
|
57 public static final LIRInstructionClass<SPARCArrayEqualsOp> TYPE = LIRInstructionClass.create(SPARCArrayEqualsOp.class); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
58 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
59 private final Kind kind; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
60 private final int arrayBaseOffset; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
61 private final int arrayIndexScale; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
62 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
63 @Def({REG}) protected Value resultValue; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
64 @Alive({REG}) protected Value array1Value; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
65 @Alive({REG}) protected Value array2Value; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
66 @Alive({REG}) protected Value lengthValue; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
67 @Temp({REG}) protected Value temp1; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
68 @Temp({REG}) protected Value temp2; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
69 @Temp({REG}) protected Value temp3; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
70 @Temp({REG}) protected Value temp4; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
71 @Temp({REG}) protected Value temp5; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
72 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
73 public SPARCArrayEqualsOp(LIRGeneratorTool tool, Kind kind, Value result, Value array1, Value array2, Value length) { |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
17144
diff
changeset
|
74 super(TYPE); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
75 this.kind = kind; |
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 Class<?> arrayClass = Array.newInstance(kind.toJavaClass(), 0).getClass(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
78 this.arrayBaseOffset = unsafe.arrayBaseOffset(arrayClass); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
79 this.arrayIndexScale = unsafe.arrayIndexScale(arrayClass); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
80 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
81 this.resultValue = result; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
82 this.array1Value = array1; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
83 this.array2Value = array2; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
84 this.lengthValue = length; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
85 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
86 // Allocate some temporaries. |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
87 this.temp1 = tool.newVariable(LIRKind.derivedReference(tool.target().wordKind)); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
88 this.temp2 = tool.newVariable(LIRKind.derivedReference(tool.target().wordKind)); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
89 this.temp3 = tool.newVariable(LIRKind.value(tool.target().wordKind)); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
90 this.temp4 = tool.newVariable(LIRKind.value(tool.target().wordKind)); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
91 this.temp5 = tool.newVariable(LIRKind.value(tool.target().wordKind)); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
92 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
93 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
94 @Override |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
95 public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
96 Register result = asRegister(resultValue); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
97 Register array1 = asRegister(temp1); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
98 Register array2 = asRegister(temp2); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
99 Register length = asRegister(temp3); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
100 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
101 Label trueLabel = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
102 Label falseLabel = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
103 Label done = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
104 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
105 // Load array base addresses. |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
106 masm.add(asObjectReg(array1Value), arrayBaseOffset, array1); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
107 masm.add(asObjectReg(array2Value), arrayBaseOffset, array2); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
108 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
109 // Get array length in bytes. |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
110 masm.mulx(asIntReg(lengthValue), arrayIndexScale, length); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
111 masm.mov(length, result); // copy |
17109
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 emit8ByteCompare(masm, result, array1, array2, length, trueLabel, falseLabel); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
114 emitTailCompares(masm, result, array1, array2, trueLabel, falseLabel); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
115 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
116 // Return true |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
117 masm.bind(trueLabel); |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
118 masm.mov(1, result); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
119 masm.bicc(Always, ANNUL, done); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
120 masm.nop(); |
17109
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 // Return false |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
123 masm.bind(falseLabel); |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
124 masm.mov(g0, result); |
17109
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 // That's it |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
127 masm.bind(done); |
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 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
130 /** |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
131 * Vector size used in {@link #emit8ByteCompare}. |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
132 */ |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
133 private static final int VECTOR_SIZE = 8; |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
134 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
135 /** |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
136 * Emits code that uses 8-byte vector compares. |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
137 */ |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
138 private void emit8ByteCompare(SPARCMacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) { |
21405
cdb5eda3a4b5
[SPARC] sign extend array compare length
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19678
diff
changeset
|
139 assert lengthValue.getPlatformKind().equals(Kind.Int); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
140 Label loop = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
141 Label compareTail = new Label(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
142 Label compareTailCorrectVectorEnd = new Label(); |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
143 |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
144 Register tempReg1 = asRegister(temp4); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
145 Register tempReg2 = asRegister(temp5); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
146 |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
147 boolean hasCBcond = masm.hasFeature(CPUFeature.CBCOND); |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
148 |
21405
cdb5eda3a4b5
[SPARC] sign extend array compare length
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19678
diff
changeset
|
149 masm.sra(length, 0, length); |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
150 masm.and(result, VECTOR_SIZE - 1, result); // tail count (in bytes) |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
151 masm.andcc(length, ~(VECTOR_SIZE - 1), length); // vector count (in bytes) |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
152 masm.bpcc(ConditionFlag.Equal, NOT_ANNUL, compareTail, CC.Xcc, PREDICT_NOT_TAKEN); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
153 |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
154 masm.sub(length, VECTOR_SIZE, length); // Delay slot |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
155 masm.add(array1, length, array1); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
156 masm.add(array2, length, array2); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
157 masm.sub(g0, length, length); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
158 |
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
|
159 // Compare the last element first |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
160 masm.ldx(new SPARCAddress(array1, 0), tempReg1); |
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
161 masm.ldx(new SPARCAddress(array2, 0), tempReg2); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
162 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
163 masm.cbcondx(NotEqual, tempReg1, tempReg2, falseLabel); |
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
164 masm.nop(); // for optimal performance (see manual) |
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
165 masm.cbcondx(Equal, length, 0, compareTailCorrectVectorEnd); |
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
166 masm.nop(); // for optimal performance (see manual) |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
167 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
168 masm.cmp(tempReg1, tempReg2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
169 masm.bpcc(NotEqual, NOT_ANNUL, falseLabel, Xcc, PREDICT_NOT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
170 masm.nop(); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
171 masm.bpr(Rc_z, NOT_ANNUL, compareTailCorrectVectorEnd, PREDICT_NOT_TAKEN, length); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
172 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
173 } |
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
|
174 |
17110
fe935dbf9863
Remove unused imports
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17109
diff
changeset
|
175 // Load the first value from array 1 (Later done in back branch delay-slot) |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
176 masm.ldx(new SPARCAddress(array1, length), tempReg1); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
177 masm.bind(loop); |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
178 masm.ldx(new SPARCAddress(array2, length), tempReg2); |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
179 masm.cmp(tempReg1, tempReg2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
180 masm.bpcc(NotEqual, NOT_ANNUL, falseLabel, Xcc, PREDICT_NOT_TAKEN); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
181 // Delay slot, not annul, add for next iteration |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
182 masm.addcc(length, VECTOR_SIZE, length); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
183 // Annul, to prevent access past the array |
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
184 masm.bpcc(NotEqual, ANNUL, loop, Xcc, PREDICT_TAKEN); |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
185 masm.ldx(new SPARCAddress(array1, length), tempReg1); // Load in delay slot |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
186 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
187 // Tail count zero, therefore we can go to the end |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
188 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
189 masm.cbcondx(Equal, result, 0, trueLabel); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
190 } else { |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
191 masm.bpr(Rc_z, NOT_ANNUL, trueLabel, PREDICT_TAKEN, result); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
192 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
193 } |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
194 |
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
|
195 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
|
196 // Correct the array pointers |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
197 masm.add(array1, VECTOR_SIZE, array1); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
198 masm.add(array2, VECTOR_SIZE, array2); |
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
|
199 |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
200 masm.bind(compareTail); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
201 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
202 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
203 /** |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
204 * 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
|
205 */ |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
206 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
|
207 Label compare2Bytes = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
208 Label compare1Byte = new Label(); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
209 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
210 Register tempReg1 = asRegister(temp3); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
211 Register tempReg2 = asRegister(temp4); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
212 boolean hasCBcond = masm.hasFeature(CBCOND); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
213 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
214 if (kind.getByteCount() <= 4) { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
215 // Compare trailing 4 bytes, if any. |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
216 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
217 masm.cbcondx(Less, result, 4, compare2Bytes); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
218 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
219 masm.cmp(result, 4); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
220 masm.bpcc(Less, NOT_ANNUL, compare2Bytes, Xcc, PREDICT_NOT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
221 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
222 } |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
223 |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
224 masm.lduw(new SPARCAddress(array1, 0), tempReg1); |
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
225 masm.lduw(new SPARCAddress(array2, 0), tempReg2); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
226 |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
227 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
228 masm.cbcondx(NotEqual, tempReg1, tempReg2, falseLabel); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
229 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
230 masm.cmp(tempReg1, tempReg2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
231 masm.bpcc(NotEqual, NOT_ANNUL, falseLabel, Xcc, PREDICT_NOT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
232 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
233 } |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
234 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
235 if (kind.getByteCount() <= 2) { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
236 // Move array pointers forward. |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
237 masm.add(array1, 4, array1); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
238 masm.add(array2, 4, array2); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
239 masm.sub(result, 4, result); |
17109
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 // Compare trailing 2 bytes, if any. |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
242 masm.bind(compare2Bytes); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
243 |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
244 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
245 masm.cbcondx(Less, result, 2, compare1Byte); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
246 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
247 masm.cmp(result, 2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
248 masm.bpcc(Less, NOT_ANNUL, compare1Byte, Xcc, PREDICT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
249 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
250 } |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
251 |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
252 masm.lduh(new SPARCAddress(array1, 0), tempReg1); |
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
253 masm.lduh(new SPARCAddress(array2, 0), tempReg2); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
254 |
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
255 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
256 masm.cbcondx(NotEqual, tempReg1, tempReg2, falseLabel); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
257 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
258 masm.cmp(tempReg1, tempReg2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
259 masm.bpcc(NotEqual, NOT_ANNUL, falseLabel, Xcc, PREDICT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
260 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
261 } |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
262 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
263 // 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
|
264 if (kind.getByteCount() <= 1) { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
265 // Move array pointers forward before we compare the last trailing byte. |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
266 masm.add(array1, 2, array1); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
267 masm.add(array2, 2, array2); |
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
268 masm.sub(result, 2, result); |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
269 |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
270 // Compare trailing byte, if any. |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
271 masm.bind(compare1Byte); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
272 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
273 masm.cbcondx(NotEqual, result, 1, trueLabel); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
274 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
275 masm.cmp(result, 1); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
276 masm.bpcc(NotEqual, NOT_ANNUL, trueLabel, Xcc, PREDICT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
277 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
278 } |
19677
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
279 masm.ldub(new SPARCAddress(array1, 0), tempReg1); |
00d7b0adaf66
[SPARC] Change ld/st ops of SPARC to functions
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19675
diff
changeset
|
280 masm.ldub(new SPARCAddress(array2, 0), tempReg2); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
281 if (hasCBcond) { |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
282 masm.cbcondx(NotEqual, tempReg1, tempReg2, falseLabel); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
283 } else { |
19675
f1b4f2613702
[SPARC] Change arithmetic ops of SPARC to functions in assembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19670
diff
changeset
|
284 masm.cmp(tempReg1, tempReg2); |
19668
413ac504d74e
[SPARC] Simplify branch instructions (No more object allocations), Tidy up SPARCControlFlow and SPARCAssembler
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17144
diff
changeset
|
285 masm.bpcc(NotEqual, NOT_ANNUL, falseLabel, Xcc, PREDICT_TAKEN); |
19670
7d3afd4356a2
[SPARC] Remove all object oriented fmt00 instructions (sethi, nop, cbcond) and use simple function calls
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19668
diff
changeset
|
286 masm.nop(); |
17144
44a96c7413a7
[SPARC] Gearing up with CBcond instruction
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
17116
diff
changeset
|
287 } |
17109
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
288 } else { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
289 masm.bind(compare1Byte); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
290 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
291 } else { |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
292 masm.bind(compare2Bytes); |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
293 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
294 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
295 } |
1a92d77a851b
[SPARC] Implementing ArrayEqualsOp for sparc
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
diff
changeset
|
296 } |