src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java
author erikj
Tue, 12 Sep 2017 19:03:39 +0200
changeset 47216 71c04702a3d5
parent 46963 hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java@089674d9949b
child 47798 9fe9292f5931
permissions -rw-r--r--
8187443: Forest Consolidation: Move files to unified layout Reviewed-by: darcy, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     2
 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    23
package org.graalvm.compiler.lir.amd64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    24
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import static jdk.vm.ci.code.ValueUtil.asRegister;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    29
import java.lang.reflect.Array;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    30
import java.lang.reflect.Field;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    31
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import org.graalvm.compiler.asm.Label;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import org.graalvm.compiler.asm.amd64.AMD64Address;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    36
import org.graalvm.compiler.asm.amd64.AMD64Assembler.OperandSize;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    37
import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import org.graalvm.compiler.core.common.LIRKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import org.graalvm.compiler.lir.LIRInstructionClass;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.lir.Opcode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import jdk.vm.ci.amd64.AMD64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import jdk.vm.ci.amd64.AMD64.CPUFeature;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import jdk.vm.ci.amd64.AMD64Kind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import jdk.vm.ci.code.Register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import jdk.vm.ci.code.TargetDescription;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import jdk.vm.ci.meta.JavaKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import jdk.vm.ci.meta.Value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import sun.misc.Unsafe;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
 * Emits code which compares two arrays of the same length. If the CPU supports any vector
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
 * instructions specialized code is emitted to leverage these instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
@Opcode("ARRAY_EQUALS")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
public final class AMD64ArrayEqualsOp extends AMD64LIRInstruction {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
    public static final LIRInstructionClass<AMD64ArrayEqualsOp> TYPE = LIRInstructionClass.create(AMD64ArrayEqualsOp.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
    private final JavaKind kind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
    private final int arrayBaseOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
    private final int arrayIndexScale;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
    @Def({REG}) protected Value resultValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
    @Alive({REG}) protected Value array1Value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
    @Alive({REG}) protected Value array2Value;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
    @Alive({REG}) protected Value lengthValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
    @Temp({REG}) protected Value temp1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
    @Temp({REG}) protected Value temp2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
    @Temp({REG}) protected Value temp3;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
    @Temp({REG}) protected Value temp4;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    74
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    75
    @Temp({REG, ILLEGAL}) protected Value temp5;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    76
    @Temp({REG, ILLEGAL}) protected Value tempXMM;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    77
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
    @Temp({REG, ILLEGAL}) protected Value vectorTemp1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
    @Temp({REG, ILLEGAL}) protected Value vectorTemp2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
    public AMD64ArrayEqualsOp(LIRGeneratorTool tool, JavaKind kind, Value result, Value array1, Value array2, Value length) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
        super(TYPE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
        this.kind = kind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
        Class<?> arrayClass = Array.newInstance(kind.toJavaClass(), 0).getClass();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
        this.arrayBaseOffset = UNSAFE.arrayBaseOffset(arrayClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
        this.arrayIndexScale = UNSAFE.arrayIndexScale(arrayClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
        this.resultValue = result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
        this.array1Value = array1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
        this.array2Value = array2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        this.lengthValue = length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
        // Allocate some temporaries.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
        this.temp1 = tool.newVariable(LIRKind.unknownReference(tool.target().arch.getWordKind()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
        this.temp2 = tool.newVariable(LIRKind.unknownReference(tool.target().arch.getWordKind()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
        this.temp3 = tool.newVariable(LIRKind.value(tool.target().arch.getWordKind()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        this.temp4 = tool.newVariable(LIRKind.value(tool.target().arch.getWordKind()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   100
        this.temp5 = kind.isNumericFloat() ? tool.newVariable(LIRKind.value(tool.target().arch.getWordKind())) : Value.ILLEGAL;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   101
        if (kind == JavaKind.Float) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   102
            this.tempXMM = tool.newVariable(LIRKind.value(AMD64Kind.SINGLE));
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   103
        } else if (kind == JavaKind.Double) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   104
            this.tempXMM = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   105
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   106
            this.tempXMM = Value.ILLEGAL;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   107
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   108
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
        // We only need the vector temporaries if we generate SSE code.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
        if (supportsSSE41(tool.target())) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
            this.vectorTemp1 = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
            this.vectorTemp2 = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
            this.vectorTemp1 = Value.ILLEGAL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
            this.vectorTemp2 = Value.ILLEGAL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
    public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
        Register result = asRegister(resultValue);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
        Register array1 = asRegister(temp1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
        Register array2 = asRegister(temp2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
        Register length = asRegister(temp3);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
        Label trueLabel = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
        Label falseLabel = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
        Label done = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
        // Load array base addresses.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
        masm.leaq(array1, new AMD64Address(asRegister(array1Value), arrayBaseOffset));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
        masm.leaq(array2, new AMD64Address(asRegister(array2Value), arrayBaseOffset));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
        // Get array length in bytes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
        masm.imull(length, asRegister(lengthValue), arrayIndexScale);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
        masm.movl(result, length); // copy
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
        if (supportsAVX2(crb.target)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
            emitAVXCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
        } else if (supportsSSE41(crb.target)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
            emitSSE41Compare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
        emit8ByteCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
        emitTailCompares(masm, result, array1, array2, length, trueLabel, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
        // Return true
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
        masm.bind(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
        masm.movl(result, 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
        masm.jmpb(done);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   151
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   152
        // Return false
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   153
        masm.bind(falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
        masm.xorl(result, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
        // That's it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
        masm.bind(done);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
     * Returns if the underlying AMD64 architecture supports SSE 4.1 instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   162
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   163
     * @param target target description of the underlying architecture
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   164
     * @return true if the underlying architecture supports SSE 4.1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
    private static boolean supportsSSE41(TargetDescription target) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
        AMD64 arch = (AMD64) target.arch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
        return arch.getFeatures().contains(CPUFeature.SSE4_1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
     * Vector size used in {@link #emitSSE41Compare}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
    private static final int SSE4_1_VECTOR_SIZE = 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
     * Emits code that uses SSE4.1 128-bit (16-byte) vector compares.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
    private void emitSSE41Compare(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
        assert supportsSSE41(crb.target);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
        Register vector1 = asRegister(vectorTemp1, AMD64Kind.DOUBLE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   183
        Register vector2 = asRegister(vectorTemp2, AMD64Kind.DOUBLE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   184
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
        Label loop = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   186
        Label compareTail = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   188
        boolean requiresNaNCheck = kind.isNumericFloat();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   189
        Label loopCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   190
        Label nanCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   191
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
        // Compare 16-byte vectors
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
        masm.andl(result, SSE4_1_VECTOR_SIZE - 1); // tail count (in bytes)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
        masm.andl(length, ~(SSE4_1_VECTOR_SIZE - 1)); // vector count (in bytes)
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   195
        masm.jcc(ConditionFlag.Zero, compareTail);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   197
        masm.leaq(array1, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
        masm.leaq(array2, new AMD64Address(array2, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
        masm.negq(length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   200
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   201
        // Align the main loop
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
        masm.align(crb.target.wordSize * 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   203
        masm.bind(loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   204
        masm.movdqu(vector1, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
        masm.movdqu(vector2, new AMD64Address(array2, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
        masm.pxor(vector1, vector2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   207
        masm.ptest(vector1, vector1);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   208
        masm.jcc(ConditionFlag.NotZero, requiresNaNCheck ? nanCheck : falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   209
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   210
        masm.bind(loopCheck);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   211
        masm.addq(length, SSE4_1_VECTOR_SIZE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   212
        masm.jcc(ConditionFlag.NotZero, loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   214
        masm.testl(result, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   215
        masm.jcc(ConditionFlag.Zero, trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   216
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   217
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   218
            Label unalignedCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   219
            masm.jmpb(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   220
            masm.bind(nanCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   221
            emitFloatCompareWithinRange(crb, masm, array1, array2, length, 0, falseLabel, SSE4_1_VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   222
            masm.jmpb(loopCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   223
            masm.bind(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   224
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   225
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   226
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   227
         * Compare the remaining bytes with an unaligned memory load aligned to the end of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
         * array.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   230
        masm.movdqu(vector1, new AMD64Address(array1, result, Scale.Times1, -SSE4_1_VECTOR_SIZE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
        masm.movdqu(vector2, new AMD64Address(array2, result, Scale.Times1, -SSE4_1_VECTOR_SIZE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
        masm.pxor(vector1, vector2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   233
        masm.ptest(vector1, vector1);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   234
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   235
            masm.jcc(ConditionFlag.Zero, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   236
            emitFloatCompareWithinRange(crb, masm, array1, array2, result, -SSE4_1_VECTOR_SIZE, falseLabel, SSE4_1_VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   237
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   238
            masm.jcc(ConditionFlag.NotZero, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   239
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   240
        masm.jmp(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   242
        masm.bind(compareTail);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
        masm.movl(length, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   244
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   245
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   247
     * Returns if the underlying AMD64 architecture supports AVX instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
     * @param target target description of the underlying architecture
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   250
     * @return true if the underlying architecture supports AVX
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
    private static boolean supportsAVX2(TargetDescription target) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
        AMD64 arch = (AMD64) target.arch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
        return arch.getFeatures().contains(CPUFeature.AVX2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   255
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   256
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
     * Vector size used in {@link #emitAVXCompare}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
    private static final int AVX_VECTOR_SIZE = 32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
    private void emitAVXCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
        assert supportsAVX2(crb.target);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   264
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
        Register vector1 = asRegister(vectorTemp1, AMD64Kind.DOUBLE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
        Register vector2 = asRegister(vectorTemp2, AMD64Kind.DOUBLE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
        Label loop = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
        Label compareTail = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   271
        boolean requiresNaNCheck = kind.isNumericFloat();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   272
        Label loopCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   273
        Label nanCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   274
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
        // Compare 16-byte vectors
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
        masm.andl(result, AVX_VECTOR_SIZE - 1); // tail count (in bytes)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   277
        masm.andl(length, ~(AVX_VECTOR_SIZE - 1)); // vector count (in bytes)
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   278
        masm.jcc(ConditionFlag.Zero, compareTail);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   279
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   280
        masm.leaq(array1, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
        masm.leaq(array2, new AMD64Address(array2, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
        masm.negq(length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
        // Align the main loop
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
        masm.align(crb.target.wordSize * 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
        masm.bind(loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
        masm.vmovdqu(vector1, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
        masm.vmovdqu(vector2, new AMD64Address(array2, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
        masm.vpxor(vector1, vector1, vector2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
        masm.vptest(vector1, vector1);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   291
        masm.jcc(ConditionFlag.NotZero, requiresNaNCheck ? nanCheck : falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   292
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   293
        masm.bind(loopCheck);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
        masm.addq(length, AVX_VECTOR_SIZE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
        masm.jcc(ConditionFlag.NotZero, loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
        masm.testl(result, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
        masm.jcc(ConditionFlag.Zero, trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   300
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   301
            Label unalignedCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   302
            masm.jmpb(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   303
            masm.bind(nanCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   304
            emitFloatCompareWithinRange(crb, masm, array1, array2, length, 0, falseLabel, AVX_VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   305
            masm.jmpb(loopCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   306
            masm.bind(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   307
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   308
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   309
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   310
         * Compare the remaining bytes with an unaligned memory load aligned to the end of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   311
         * array.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   312
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   313
        masm.vmovdqu(vector1, new AMD64Address(array1, result, Scale.Times1, -AVX_VECTOR_SIZE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
        masm.vmovdqu(vector2, new AMD64Address(array2, result, Scale.Times1, -AVX_VECTOR_SIZE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   315
        masm.vpxor(vector1, vector1, vector2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
        masm.vptest(vector1, vector1);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   317
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   318
            masm.jcc(ConditionFlag.Zero, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   319
            emitFloatCompareWithinRange(crb, masm, array1, array2, result, -AVX_VECTOR_SIZE, falseLabel, AVX_VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   320
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   321
            masm.jcc(ConditionFlag.NotZero, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   322
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
        masm.jmp(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   324
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   325
        masm.bind(compareTail);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   326
        masm.movl(length, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
     * Vector size used in {@link #emit8ByteCompare}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
    private static final int VECTOR_SIZE = 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   335
     * Emits code that uses 8-byte vector compares.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   336
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   337
    private void emit8ByteCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
        Label loop = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
        Label compareTail = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   340
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   341
        boolean requiresNaNCheck = kind.isNumericFloat();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   342
        Label loopCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   343
        Label nanCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   344
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   345
        Register temp = asRegister(temp4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   346
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   347
        masm.andl(result, VECTOR_SIZE - 1); // tail count (in bytes)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   348
        masm.andl(length, ~(VECTOR_SIZE - 1));  // vector count (in bytes)
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   349
        masm.jcc(ConditionFlag.Zero, compareTail);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   350
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   351
        masm.leaq(array1, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   352
        masm.leaq(array2, new AMD64Address(array2, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   353
        masm.negq(length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   355
        // Align the main loop
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   356
        masm.align(crb.target.wordSize * 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   357
        masm.bind(loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   358
        masm.movq(temp, new AMD64Address(array1, length, Scale.Times1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   359
        masm.cmpq(temp, new AMD64Address(array2, length, Scale.Times1, 0));
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   360
        masm.jcc(ConditionFlag.NotEqual, requiresNaNCheck ? nanCheck : falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   361
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   362
        masm.bind(loopCheck);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   363
        masm.addq(length, VECTOR_SIZE);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   364
        masm.jccb(ConditionFlag.NotZero, loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   365
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   366
        masm.testl(result, result);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   367
        masm.jcc(ConditionFlag.Zero, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   368
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   369
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   370
            // NaN check is slow path and hence placed outside of the main loop.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   371
            Label unalignedCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   372
            masm.jmpb(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   373
            masm.bind(nanCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   374
            // At most two iterations, unroll in the emitted code.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   375
            for (int offset = 0; offset < VECTOR_SIZE; offset += kind.getByteCount()) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   376
                emitFloatCompare(masm, array1, array2, length, offset, falseLabel, kind.getByteCount() == VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   377
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   378
            masm.jmpb(loopCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   379
            masm.bind(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   380
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   381
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   382
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   383
         * Compare the remaining bytes with an unaligned memory load aligned to the end of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   384
         * array.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   385
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   386
        masm.movq(temp, new AMD64Address(array1, result, Scale.Times1, -VECTOR_SIZE));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   387
        masm.cmpq(temp, new AMD64Address(array2, result, Scale.Times1, -VECTOR_SIZE));
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   388
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   389
            masm.jcc(ConditionFlag.Equal, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   390
            // At most two iterations, unroll in the emitted code.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   391
            for (int offset = 0; offset < VECTOR_SIZE; offset += kind.getByteCount()) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   392
                emitFloatCompare(masm, array1, array2, result, -VECTOR_SIZE + offset, falseLabel, kind.getByteCount() == VECTOR_SIZE);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   393
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   394
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   395
            masm.jccb(ConditionFlag.NotEqual, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   396
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   397
        masm.jmpb(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   398
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   399
        masm.bind(compareTail);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   400
        masm.movl(length, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   401
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   402
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   403
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   404
     * Emits code to compare the remaining 1 to 4 bytes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   405
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   406
    private void emitTailCompares(AMD64MacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   407
        Label compare2Bytes = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   408
        Label compare1Byte = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   409
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   410
        Register temp = asRegister(temp4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   411
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   412
        if (kind.getByteCount() <= 4) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   413
            // Compare trailing 4 bytes, if any.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   414
            masm.testl(result, 4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   415
            masm.jccb(ConditionFlag.Zero, compare2Bytes);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   416
            masm.movl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   417
            masm.cmpl(temp, new AMD64Address(array2, 0));
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   418
            if (kind == JavaKind.Float) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   419
                masm.jccb(ConditionFlag.Equal, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   420
                emitFloatCompare(masm, array1, array2, Register.None, 0, falseLabel, true);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   421
                masm.jmpb(trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   422
            } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   423
                masm.jccb(ConditionFlag.NotEqual, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   424
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   425
            if (kind.getByteCount() <= 2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   426
                // Move array pointers forward.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   427
                masm.leaq(array1, new AMD64Address(array1, 4));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   428
                masm.leaq(array2, new AMD64Address(array2, 4));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   429
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   430
                // Compare trailing 2 bytes, if any.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   431
                masm.bind(compare2Bytes);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   432
                masm.testl(result, 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   433
                masm.jccb(ConditionFlag.Zero, compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   434
                masm.movzwl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   435
                masm.movzwl(length, new AMD64Address(array2, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   436
                masm.cmpl(temp, length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   437
                masm.jccb(ConditionFlag.NotEqual, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   438
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   439
                // The one-byte tail compare is only required for boolean and byte arrays.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   440
                if (kind.getByteCount() <= 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   441
                    // Move array pointers forward before we compare the last trailing byte.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   442
                    masm.leaq(array1, new AMD64Address(array1, 2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   443
                    masm.leaq(array2, new AMD64Address(array2, 2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   444
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   445
                    // Compare trailing byte, if any.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   446
                    masm.bind(compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   447
                    masm.testl(result, 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   448
                    masm.jccb(ConditionFlag.Zero, trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   449
                    masm.movzbl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   450
                    masm.movzbl(length, new AMD64Address(array2, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   451
                    masm.cmpl(temp, length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   452
                    masm.jccb(ConditionFlag.NotEqual, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   453
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   454
                    masm.bind(compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   455
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   456
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
                masm.bind(compare2Bytes);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   458
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   459
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   460
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   461
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   462
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   463
     * Emits code to fall through if {@code src} is NaN, otherwise jump to {@code branchOrdered}.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   464
     */
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   465
    private void emitNaNCheck(AMD64MacroAssembler masm, AMD64Address src, Label branchIfNonNaN) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   466
        assert kind.isNumericFloat();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   467
        Register tempXMMReg = asRegister(tempXMM);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   468
        if (kind == JavaKind.Float) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   469
            masm.movflt(tempXMMReg, src);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   470
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   471
            masm.movdbl(tempXMMReg, src);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   472
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   473
        SSEOp.UCOMIS.emit(masm, kind == JavaKind.Float ? OperandSize.PS : OperandSize.PD, tempXMMReg, tempXMMReg);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   474
        masm.jcc(ConditionFlag.NoParity, branchIfNonNaN);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   475
    }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   476
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   477
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   478
     * Emits code to compare if two floats are bitwise equal or both NaN.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   479
     */
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   480
    private void emitFloatCompare(AMD64MacroAssembler masm, Register base1, Register base2, Register index, int offset, Label falseLabel, boolean skipBitwiseCompare) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   481
        AMD64Address address1 = new AMD64Address(base1, index, Scale.Times1, offset);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   482
        AMD64Address address2 = new AMD64Address(base2, index, Scale.Times1, offset);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   483
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   484
        Label bitwiseEqual = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   485
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   486
        if (!skipBitwiseCompare) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   487
            // Bitwise compare
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   488
            Register temp = asRegister(temp4);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   489
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   490
            if (kind == JavaKind.Float) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   491
                masm.movl(temp, address1);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   492
                masm.cmpl(temp, address2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   493
            } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   494
                masm.movq(temp, address1);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   495
                masm.cmpq(temp, address2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   496
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   497
            masm.jccb(ConditionFlag.Equal, bitwiseEqual);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   498
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   499
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   500
        emitNaNCheck(masm, address1, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   501
        emitNaNCheck(masm, address2, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   502
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   503
        masm.bind(bitwiseEqual);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   504
    }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   505
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   506
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   507
     * Emits code to compare float equality within a range.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   508
     */
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   509
    private void emitFloatCompareWithinRange(CompilationResultBuilder crb, AMD64MacroAssembler masm, Register base1, Register base2, Register index, int offset, Label falseLabel, int range) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   510
        assert kind.isNumericFloat();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   511
        Label loop = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   512
        Register i = asRegister(temp5);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   513
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   514
        masm.movq(i, range);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   515
        masm.negq(i);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   516
        // Align the main loop
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   517
        masm.align(crb.target.wordSize * 2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   518
        masm.bind(loop);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   519
        emitFloatCompare(masm, base1, base2, index, offset, falseLabel, kind.getByteCount() == range);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   520
        masm.addq(index, kind.getByteCount());
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   521
        masm.addq(i, kind.getByteCount());
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   522
        masm.jccb(ConditionFlag.NotZero, loop);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   523
        // Floats within the range are equal, revert change to the register index
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   524
        masm.subq(index, range);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   525
    }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   526
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   527
    private static final Unsafe UNSAFE = initUnsafe();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   528
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   529
    private static Unsafe initUnsafe() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   530
        try {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   531
            return Unsafe.getUnsafe();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   532
        } catch (SecurityException se) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   533
            try {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   534
                Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   535
                theUnsafe.setAccessible(true);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   536
                return (Unsafe) theUnsafe.get(Unsafe.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   537
            } catch (Exception e) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   538
                throw new RuntimeException("exception while trying to get Unsafe", e);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   539
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   540
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   542
}