src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64ArrayEqualsOp.java
author dlong
Thu, 14 Nov 2019 12:21:00 -0800
changeset 59095 03fbcd06b4c0
parent 58299 6df94ce3ab2f
permissions -rw-r--r--
8233841: Update Graal Reviewed-by: kvn
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
/*
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
     2
 * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
43972
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
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 48861
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 48861
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.lir.amd64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    27
import static jdk.vm.ci.code.ValueUtil.asRegister;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    28
import static org.graalvm.compiler.asm.amd64.AMD64Assembler.AMD64BinaryArithmetic.XOR;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    29
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.CONST;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    30
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    31
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    32
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    33
import java.util.Objects;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    34
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import org.graalvm.compiler.asm.Label;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import org.graalvm.compiler.asm.amd64.AMD64Address;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    38
import org.graalvm.compiler.asm.amd64.AMD64Assembler;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import org.graalvm.compiler.asm.amd64.AMD64Assembler.ConditionFlag;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    40
import org.graalvm.compiler.asm.amd64.AMD64Assembler.SSEOp;
51436
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
    41
import org.graalvm.compiler.asm.amd64.AMD64BaseAssembler.OperandSize;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.asm.amd64.AMD64MacroAssembler;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    43
import org.graalvm.compiler.asm.amd64.AVXKind;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.core.common.LIRKind;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    45
import org.graalvm.compiler.debug.GraalError;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.lir.LIRInstructionClass;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    47
import org.graalvm.compiler.lir.LIRValueUtil;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.lir.Opcode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    52
import jdk.vm.ci.amd64.AMD64;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    53
import jdk.vm.ci.amd64.AMD64.CPUFeature;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    54
import jdk.vm.ci.amd64.AMD64Kind;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    55
import jdk.vm.ci.code.Register;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    56
import jdk.vm.ci.code.TargetDescription;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    57
import jdk.vm.ci.meta.JavaKind;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    58
import jdk.vm.ci.meta.Value;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    59
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
 * 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
    62
 * instructions specialized code is emitted to leverage these instructions.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    63
 *
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    64
 * This op can also compare arrays of different integer types (e.g. {@code byte[]} and
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    65
 * {@code char[]}) with on-the-fly sign- or zero-extension. If one of the given arrays is a
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    66
 * {@code char[]} array, the smaller elements are zero-extended, otherwise they are sign-extended.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
@Opcode("ARRAY_EQUALS")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
public final class AMD64ArrayEqualsOp extends AMD64LIRInstruction {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
    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
    71
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    72
    private final JavaKind kind1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    73
    private final JavaKind kind2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    74
    private final int arrayBaseOffset1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    75
    private final int arrayBaseOffset2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    76
    private final Scale arrayIndexScale1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    77
    private final Scale arrayIndexScale2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    78
    private final AVXKind.AVXSize vectorSize;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    79
    private final boolean signExtend;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    81
    @Def({REG}) private Value resultValue;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    82
    @Alive({REG}) private Value array1Value;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    83
    @Alive({REG}) private Value array2Value;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    84
    @Alive({REG, CONST}) private Value lengthValue;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
    85
    @Temp({REG, ILLEGAL}) private Value temp1;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
    86
    @Temp({REG, ILLEGAL}) private Value temp2;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    87
    @Temp({REG}) private Value temp3;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
    88
    @Temp({REG, ILLEGAL}) private Value temp4;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    89
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    90
    @Temp({REG, ILLEGAL}) private Value temp5;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    91
    @Temp({REG, ILLEGAL}) private Value tempXMM;
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
    92
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    93
    @Temp({REG, ILLEGAL}) private Value vectorTemp1;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    94
    @Temp({REG, ILLEGAL}) private Value vectorTemp2;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    95
    @Temp({REG, ILLEGAL}) private Value vectorTemp3;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
    96
    @Temp({REG, ILLEGAL}) private Value vectorTemp4;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    98
    public AMD64ArrayEqualsOp(LIRGeneratorTool tool, JavaKind kind1, JavaKind kind2, Value result, Value array1, Value array2, Value length,
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    99
                    boolean directPointers, int maxVectorSize) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
        super(TYPE);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   101
        this.kind1 = kind1;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   102
        this.kind2 = kind2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   103
        this.signExtend = kind1 != JavaKind.Char && kind2 != JavaKind.Char;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   105
        assert kind1.isNumericInteger() && kind2.isNumericInteger() || kind1 == kind2;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   106
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   107
        this.arrayBaseOffset1 = directPointers ? 0 : tool.getProviders().getMetaAccess().getArrayBaseOffset(kind1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   108
        this.arrayBaseOffset2 = directPointers ? 0 : tool.getProviders().getMetaAccess().getArrayBaseOffset(kind2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   109
        this.arrayIndexScale1 = Objects.requireNonNull(Scale.fromInt(tool.getProviders().getMetaAccess().getArrayIndexScale(kind1)));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   110
        this.arrayIndexScale2 = Objects.requireNonNull(Scale.fromInt(tool.getProviders().getMetaAccess().getArrayIndexScale(kind2)));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   111
        this.vectorSize = ((AMD64) tool.target().arch).getFeatures().contains(CPUFeature.AVX2) && (maxVectorSize < 0 || maxVectorSize >= 32) ? AVXKind.AVXSize.YMM : AVXKind.AVXSize.XMM;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
        this.resultValue = result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
        this.array1Value = array1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
        this.array2Value = array2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
        this.lengthValue = length;
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
        // Allocate some temporaries.
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   119
        if (supportsSSE41(tool.target()) && canGenerateConstantLengthCompare(tool.target()) && !constantLengthCompareNeedsTmpArrayPointers()) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   120
            this.temp1 = Value.ILLEGAL;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   121
            this.temp2 = Value.ILLEGAL;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   122
        } else {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   123
            this.temp1 = tool.newVariable(LIRKind.unknownReference(tool.target().arch.getWordKind()));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   124
            this.temp2 = tool.newVariable(LIRKind.unknownReference(tool.target().arch.getWordKind()));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   125
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
        this.temp3 = tool.newVariable(LIRKind.value(tool.target().arch.getWordKind()));
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   127
        if (supportsSSE41(tool.target()) && canGenerateConstantLengthCompare(tool.target())) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   128
            this.temp4 = Value.ILLEGAL;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   129
            this.temp5 = Value.ILLEGAL;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   130
        } else {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   131
            this.temp4 = tool.newVariable(LIRKind.value(tool.target().arch.getWordKind()));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   132
            this.temp5 = kind1.isNumericFloat() || kind1 != kind2 ? tool.newVariable(LIRKind.value(tool.target().arch.getWordKind())) : Value.ILLEGAL;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   133
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   135
        if (kind1 == JavaKind.Float) {
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   136
            this.tempXMM = tool.newVariable(LIRKind.value(AMD64Kind.SINGLE));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   137
        } else if (kind1 == JavaKind.Double) {
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   138
            this.tempXMM = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   139
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   140
            this.tempXMM = Value.ILLEGAL;
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   141
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   142
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
        // 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
   144
        if (supportsSSE41(tool.target())) {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   145
            if (canGenerateConstantLengthCompare(tool.target())) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   146
                LIRKind lirKind = LIRKind.value(vectorSize == AVXKind.AVXSize.YMM ? AMD64Kind.V256_BYTE : AMD64Kind.V128_BYTE);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   147
                this.vectorTemp1 = tool.newVariable(lirKind);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   148
                this.vectorTemp2 = tool.newVariable(lirKind);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   149
                this.vectorTemp3 = tool.newVariable(lirKind);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   150
                this.vectorTemp4 = tool.newVariable(lirKind);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   151
            } else {
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   152
                this.vectorTemp1 = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   153
                this.vectorTemp2 = tool.newVariable(LIRKind.value(AMD64Kind.DOUBLE));
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   154
                this.vectorTemp3 = Value.ILLEGAL;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   155
                this.vectorTemp4 = Value.ILLEGAL;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   156
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
            this.vectorTemp1 = Value.ILLEGAL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
            this.vectorTemp2 = Value.ILLEGAL;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   160
            this.vectorTemp3 = Value.ILLEGAL;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   161
            this.vectorTemp4 = Value.ILLEGAL;
43972
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
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   164
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   165
    private boolean canGenerateConstantLengthCompare(TargetDescription target) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   166
        return LIRValueUtil.isJavaConstant(lengthValue) && kind1.isNumericInteger() && (kind1 == kind2 || getElementsPerVector(AVXKind.AVXSize.XMM) <= constantLength()) && supportsSSE41(target);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   167
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   168
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   169
    private int constantLength() {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   170
        return LIRValueUtil.asJavaConstant(lengthValue).asInt();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   171
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   172
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
    public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
        Register result = asRegister(resultValue);
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
        Label trueLabel = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
        Label falseLabel = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
        Label done = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   181
        if (canGenerateConstantLengthCompare(crb.target)) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   182
            emitConstantLengthArrayCompareBytes(crb, masm, new Register[]{asRegister(vectorTemp1), asRegister(vectorTemp2), asRegister(vectorTemp3), asRegister(vectorTemp4)}, falseLabel);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   183
        } else {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   184
            Register array1 = asRegister(temp1);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   185
            Register array2 = asRegister(temp2);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   186
            // Load array base addresses.
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   187
            masm.leaq(array1, new AMD64Address(asRegister(array1Value), arrayBaseOffset1));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   188
            masm.leaq(array2, new AMD64Address(asRegister(array2Value), arrayBaseOffset2));
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   189
            Register length = asRegister(temp3);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   190
            // Get array length.
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   191
            if (LIRValueUtil.isJavaConstant(lengthValue)) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   192
                masm.movl(length, constantLength());
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   193
            } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   194
                masm.movl(length, asRegister(lengthValue));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   195
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   196
            // copy
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   197
            masm.movl(result, length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   198
            emitArrayCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
        }
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
        // Return true
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
        masm.bind(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   203
        masm.movl(result, 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   204
        masm.jmpb(done);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
        // Return false
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   207
        masm.bind(falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   208
        masm.xorl(result, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   209
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   210
        // That's it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   211
        masm.bind(done);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   212
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   214
    private void emitArrayCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm,
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   215
                    Register result, Register array1, Register array2, Register length,
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   216
                    Label trueLabel, Label falseLabel) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   217
        if (supportsSSE41(crb.target)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   218
            emitVectorCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   219
        }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   220
        if (kind1 == kind2) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   221
            emit8ByteCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   222
            emitTailCompares(masm, result, array1, array2, length, trueLabel, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   223
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   224
            emitDifferentKindsElementWiseCompare(crb, masm, result, array1, array2, length, trueLabel, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   225
        }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   226
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   227
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
     * 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
   230
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
     * @param target target description of the underlying architecture
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
     * @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
   233
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   234
    private static boolean supportsSSE41(TargetDescription target) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   235
        AMD64 arch = (AMD64) target.arch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   236
        return arch.getFeatures().contains(CPUFeature.SSE4_1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   237
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   238
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   239
    /**
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   240
     * Emits code that uses SSE4.1/AVX1 128-bit (16-byte) or AVX2 256-bit (32-byte) vector compares.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   242
    private void emitVectorCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm,
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   243
                    Register result, Register array1, Register array2, Register length,
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   244
                    Label trueLabel, Label falseLabel) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   245
        assert supportsSSE41(crb.target);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   247
        Register vector1 = asRegister(vectorTemp1);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   248
        Register vector2 = asRegister(vectorTemp2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   250
        int elementsPerVector = getElementsPerVector(vectorSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   251
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
        Label loop = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
        Label compareTail = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   255
        boolean requiresNaNCheck = kind1.isNumericFloat();
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   256
        Label loopCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   257
        Label nanCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   258
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
        // Compare 16-byte vectors
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   260
        masm.andl(result, elementsPerVector - 1); // tail count
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   261
        masm.andl(length, ~(elementsPerVector - 1)); // vector count
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   262
        masm.jcc(ConditionFlag.Zero, compareTail);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   264
        masm.leaq(array1, new AMD64Address(array1, length, arrayIndexScale1, 0));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   265
        masm.leaq(array2, new AMD64Address(array2, length, arrayIndexScale2, 0));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
        masm.negq(length);
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
        // Align the main loop
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
        masm.align(crb.target.wordSize * 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
        masm.bind(loop);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   271
        emitVectorLoad1(masm, vector1, array1, length, 0, vectorSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   272
        emitVectorLoad2(masm, vector2, array2, length, 0, vectorSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   273
        emitVectorCmp(masm, vector1, vector2, vectorSize);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   274
        masm.jcc(ConditionFlag.NotZero, requiresNaNCheck ? nanCheck : falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   275
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   276
        masm.bind(loopCheck);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   277
        masm.addq(length, elementsPerVector);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   278
        masm.jcc(ConditionFlag.NotZero, loop);
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.testl(result, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
        masm.jcc(ConditionFlag.Zero, trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   283
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   284
            Label unalignedCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   285
            masm.jmpb(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   286
            masm.bind(nanCheck);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   287
            emitFloatCompareWithinRange(crb, masm, array1, array2, length, 0, falseLabel, elementsPerVector);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   288
            masm.jmpb(loopCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   289
            masm.bind(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   290
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   291
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
         * 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
   294
         * array.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
         */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   296
        emitVectorLoad1(masm, vector1, array1, result, scaleDisplacement1(-vectorSize.getBytes()), vectorSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   297
        emitVectorLoad2(masm, vector2, array2, result, scaleDisplacement2(-vectorSize.getBytes()), vectorSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   298
        emitVectorCmp(masm, vector1, vector2, vectorSize);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   299
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   300
            masm.jcc(ConditionFlag.Zero, trueLabel);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   301
            emitFloatCompareWithinRange(crb, masm, array1, array2, result, -vectorSize.getBytes(), falseLabel, elementsPerVector);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   302
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   303
            masm.jcc(ConditionFlag.NotZero, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   304
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
        masm.jmp(trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   307
        masm.bind(compareTail);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   308
        masm.movl(length, result);
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
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   311
    private int getElementsPerVector(AVXKind.AVXSize vSize) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   312
        return vSize.getBytes() >> Math.max(arrayIndexScale1.log2, arrayIndexScale2.log2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   313
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   314
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   315
    private void emitVectorLoad1(AMD64MacroAssembler asm, Register dst, Register src, int displacement, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   316
        emitVectorLoad1(asm, dst, src, Register.None, displacement, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   317
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   318
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   319
    private void emitVectorLoad2(AMD64MacroAssembler asm, Register dst, Register src, int displacement, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   320
        emitVectorLoad2(asm, dst, src, Register.None, displacement, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   321
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   322
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   323
    private void emitVectorLoad1(AMD64MacroAssembler asm, Register dst, Register src, Register index, int displacement, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   324
        emitVectorLoad(asm, dst, src, index, displacement, arrayIndexScale1, arrayIndexScale2, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   325
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   326
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   327
    private void emitVectorLoad2(AMD64MacroAssembler asm, Register dst, Register src, Register index, int displacement, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   328
        emitVectorLoad(asm, dst, src, index, displacement, arrayIndexScale2, arrayIndexScale1, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   329
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   330
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   331
    private void emitVectorLoad(AMD64MacroAssembler asm, Register dst, Register src, Register index, int displacement, Scale ownScale, Scale otherScale, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   332
        AMD64Address address = new AMD64Address(src, index, ownScale, displacement);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   333
        if (ownScale.value < otherScale.value) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   334
            if (size == AVXKind.AVXSize.YMM) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   335
                getAVX2LoadAndExtendOp(ownScale, otherScale, signExtend).emit(asm, size, dst, address);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   336
            } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   337
                loadAndExtendSSE(asm, dst, address, ownScale, otherScale, signExtend);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   338
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   339
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   340
            if (size == AVXKind.AVXSize.YMM) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   341
                asm.vmovdqu(dst, address);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   342
            } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   343
                asm.movdqu(dst, address);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   344
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   345
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   346
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   347
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   348
    private int scaleDisplacement1(int displacement) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   349
        return scaleDisplacement(displacement, arrayIndexScale1, arrayIndexScale2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   350
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   351
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   352
    private int scaleDisplacement2(int displacement) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   353
        return scaleDisplacement(displacement, arrayIndexScale2, arrayIndexScale1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   354
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   355
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   356
    private static int scaleDisplacement(int displacement, Scale ownScale, Scale otherScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   357
        if (ownScale.value < otherScale.value) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   358
            return displacement >> (otherScale.log2 - ownScale.log2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   359
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   360
        return displacement;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   361
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   362
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   363
    private static AMD64Assembler.VexRMOp getAVX2LoadAndExtendOp(Scale ownScale, Scale otherScale, boolean signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   364
        switch (ownScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   365
            case Times1:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   366
                switch (otherScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   367
                    case Times2:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   368
                        return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXBW : AMD64Assembler.VexRMOp.VPMOVZXBW;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   369
                    case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   370
                        return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXBD : AMD64Assembler.VexRMOp.VPMOVZXBD;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   371
                    case Times8:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   372
                        return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXBQ : AMD64Assembler.VexRMOp.VPMOVZXBQ;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   373
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   374
                throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   375
            case Times2:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   376
                switch (otherScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   377
                    case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   378
                        return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXWD : AMD64Assembler.VexRMOp.VPMOVZXWD;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   379
                    case Times8:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   380
                        return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXWQ : AMD64Assembler.VexRMOp.VPMOVZXWQ;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   381
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   382
                throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   383
            case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   384
                return signExtend ? AMD64Assembler.VexRMOp.VPMOVSXDQ : AMD64Assembler.VexRMOp.VPMOVZXDQ;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   385
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   386
        throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   387
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   388
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   389
    private static void loadAndExtendSSE(AMD64MacroAssembler asm, Register dst, AMD64Address src, Scale ownScale, Scale otherScale, boolean signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   390
        switch (ownScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   391
            case Times1:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   392
                switch (otherScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   393
                    case Times2:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   394
                        if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   395
                            asm.pmovsxbw(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   396
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   397
                            asm.pmovzxbw(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   398
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   399
                        return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   400
                    case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   401
                        if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   402
                            asm.pmovsxbd(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   403
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   404
                            asm.pmovzxbd(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   405
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   406
                        return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   407
                    case Times8:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   408
                        if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   409
                            asm.pmovsxbq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   410
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   411
                            asm.pmovzxbq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   412
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   413
                        return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   414
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   415
                throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   416
            case Times2:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   417
                switch (otherScale) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   418
                    case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   419
                        if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   420
                            asm.pmovsxwd(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   421
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   422
                            asm.pmovzxwd(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   423
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   424
                        return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   425
                    case Times8:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   426
                        if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   427
                            asm.pmovsxwq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   428
                        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   429
                            asm.pmovzxwq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   430
                        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   431
                        return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   432
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   433
                throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   434
            case Times4:
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   435
                if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   436
                    asm.pmovsxdq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   437
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   438
                    asm.pmovzxdq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   439
                }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   440
                return;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   441
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   442
        throw GraalError.shouldNotReachHere();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   443
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   444
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   445
    private static void emitVectorCmp(AMD64MacroAssembler masm, Register vector1, Register vector2, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   446
        emitVectorXor(masm, vector1, vector2, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   447
        emitVectorTest(masm, vector1, size);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   448
    }
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   449
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   450
    private static void emitVectorXor(AMD64MacroAssembler masm, Register vector1, Register vector2, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   451
        if (size == AVXKind.AVXSize.YMM) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   452
            masm.vpxor(vector1, vector1, vector2);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   453
        } else {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   454
            masm.pxor(vector1, vector2);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   455
        }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   456
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   458
    private static void emitVectorTest(AMD64MacroAssembler masm, Register vector1, AVXKind.AVXSize size) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   459
        if (size == AVXKind.AVXSize.YMM) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   460
            masm.vptest(vector1, vector1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   461
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   462
            masm.ptest(vector1, vector1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   463
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   464
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   465
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   466
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   467
     * Vector size used in {@link #emit8ByteCompare}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   468
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   469
    private static final int VECTOR_SIZE = 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   470
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   471
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   472
     * Emits code that uses 8-byte vector compares.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   473
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   474
    private void emit8ByteCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   475
                    Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   476
        assert kind1 == kind2;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   477
        Label loop = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   478
        Label compareTail = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   479
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   480
        int elementsPerVector = 8 >> arrayIndexScale1.log2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   481
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   482
        boolean requiresNaNCheck = kind1.isNumericFloat();
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   483
        Label loopCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   484
        Label nanCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   485
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   486
        Register temp = asRegister(temp4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   487
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   488
        masm.andl(result, elementsPerVector - 1); // tail count
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   489
        masm.andl(length, ~(elementsPerVector - 1));  // vector count
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   490
        masm.jcc(ConditionFlag.Zero, compareTail);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   491
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   492
        masm.leaq(array1, new AMD64Address(array1, length, arrayIndexScale1, 0));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   493
        masm.leaq(array2, new AMD64Address(array2, length, arrayIndexScale2, 0));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   494
        masm.negq(length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   495
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   496
        // Align the main loop
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   497
        masm.align(crb.target.wordSize * 2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   498
        masm.bind(loop);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   499
        masm.movq(temp, new AMD64Address(array1, length, arrayIndexScale1, 0));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   500
        masm.cmpq(temp, new AMD64Address(array2, length, arrayIndexScale2, 0));
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   501
        masm.jcc(ConditionFlag.NotEqual, requiresNaNCheck ? nanCheck : falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   502
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   503
        masm.bind(loopCheck);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   504
        masm.addq(length, elementsPerVector);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   505
        masm.jccb(ConditionFlag.NotZero, loop);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   506
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   507
        masm.testl(result, result);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   508
        masm.jcc(ConditionFlag.Zero, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   509
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   510
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   511
            // NaN check is slow path and hence placed outside of the main loop.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   512
            Label unalignedCheck = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   513
            masm.jmpb(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   514
            masm.bind(nanCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   515
            // At most two iterations, unroll in the emitted code.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   516
            for (int offset = 0; offset < VECTOR_SIZE; offset += kind1.getByteCount()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   517
                emitFloatCompare(masm, array1, array2, length, offset, falseLabel, kind1.getByteCount() == VECTOR_SIZE);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   518
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   519
            masm.jmpb(loopCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   520
            masm.bind(unalignedCheck);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   521
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   522
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   523
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   524
         * 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
   525
         * array.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   526
         */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   527
        masm.movq(temp, new AMD64Address(array1, result, arrayIndexScale1, -VECTOR_SIZE));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   528
        masm.cmpq(temp, new AMD64Address(array2, result, arrayIndexScale2, -VECTOR_SIZE));
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   529
        if (requiresNaNCheck) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   530
            masm.jcc(ConditionFlag.Equal, trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   531
            // At most two iterations, unroll in the emitted code.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   532
            for (int offset = 0; offset < VECTOR_SIZE; offset += kind1.getByteCount()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   533
                emitFloatCompare(masm, array1, array2, result, -VECTOR_SIZE + offset, falseLabel, kind1.getByteCount() == VECTOR_SIZE);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   534
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   535
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   536
            masm.jccb(ConditionFlag.NotEqual, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   537
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   538
        masm.jmpb(trueLabel);
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
        masm.bind(compareTail);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
        masm.movl(length, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   542
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   543
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   544
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   545
     * 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
   546
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   547
    private void emitTailCompares(AMD64MacroAssembler masm,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   548
                    Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   549
        assert kind1 == kind2;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   550
        Label compare2Bytes = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   551
        Label compare1Byte = new Label();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   552
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   553
        Register temp = asRegister(temp4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   554
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   555
        if (kind1.getByteCount() <= 4) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   556
            // Compare trailing 4 bytes, if any.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   557
            masm.testl(result, arrayIndexScale1.log2 == 0 ? 4 : 4 >> arrayIndexScale1.log2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   558
            masm.jccb(ConditionFlag.Zero, compare2Bytes);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   559
            masm.movl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   560
            masm.cmpl(temp, new AMD64Address(array2, 0));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   561
            if (kind1 == JavaKind.Float) {
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   562
                masm.jccb(ConditionFlag.Equal, trueLabel);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   563
                emitFloatCompare(masm, array1, array2, Register.None, 0, falseLabel, true);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   564
                masm.jmpb(trueLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   565
            } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   566
                masm.jccb(ConditionFlag.NotEqual, falseLabel);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   567
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   568
            if (kind1.getByteCount() <= 2) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   569
                // Move array pointers forward.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   570
                masm.leaq(array1, new AMD64Address(array1, 4));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   571
                masm.leaq(array2, new AMD64Address(array2, 4));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
                // Compare trailing 2 bytes, if any.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   574
                masm.bind(compare2Bytes);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   575
                masm.testl(result, arrayIndexScale1.log2 == 0 ? 2 : 2 >> arrayIndexScale1.log2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   576
                masm.jccb(ConditionFlag.Zero, compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   577
                masm.movzwl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   578
                masm.movzwl(length, new AMD64Address(array2, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   579
                masm.cmpl(temp, length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   580
                masm.jccb(ConditionFlag.NotEqual, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   581
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   582
                // The one-byte tail compare is only required for boolean and byte arrays.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   583
                if (kind1.getByteCount() <= 1) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   584
                    // 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
   585
                    masm.leaq(array1, new AMD64Address(array1, 2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   586
                    masm.leaq(array2, new AMD64Address(array2, 2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   587
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   588
                    // Compare trailing byte, if any.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   589
                    masm.bind(compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   590
                    masm.testl(result, 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   591
                    masm.jccb(ConditionFlag.Zero, trueLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   592
                    masm.movzbl(temp, new AMD64Address(array1, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   593
                    masm.movzbl(length, new AMD64Address(array2, 0));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   594
                    masm.cmpl(temp, length);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   595
                    masm.jccb(ConditionFlag.NotEqual, falseLabel);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   596
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   597
                    masm.bind(compare1Byte);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   598
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   599
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   600
                masm.bind(compare2Bytes);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   601
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   602
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   603
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   604
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   605
    private void emitDifferentKindsElementWiseCompare(CompilationResultBuilder crb, AMD64MacroAssembler masm,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   606
                    Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   607
        assert kind1 != kind2;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   608
        assert kind1.isNumericInteger() && kind2.isNumericInteger();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   609
        Label loop = new Label();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   610
        Label compareTail = new Label();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   611
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   612
        int elementsPerLoopIteration = 4;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   613
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   614
        Register tmp1 = asRegister(temp4);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   615
        Register tmp2 = asRegister(temp5);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   616
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   617
        masm.andl(result, elementsPerLoopIteration - 1); // tail count
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   618
        masm.andl(length, ~(elementsPerLoopIteration - 1));  // bulk loop count
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   619
        masm.jcc(ConditionFlag.Zero, compareTail);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   620
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   621
        masm.leaq(array1, new AMD64Address(array1, length, arrayIndexScale1, 0));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   622
        masm.leaq(array2, new AMD64Address(array2, length, arrayIndexScale2, 0));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   623
        masm.negq(length);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   624
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   625
        // clear comparison registers because of the missing movzlq instruction
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   626
        masm.xorq(tmp1, tmp1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   627
        masm.xorq(tmp2, tmp2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   628
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   629
        // Align the main loop
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   630
        masm.align(crb.target.wordSize * 2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   631
        masm.bind(loop);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   632
        for (int i = 0; i < elementsPerLoopIteration; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   633
            emitMovBytes(masm, tmp1, new AMD64Address(array1, length, arrayIndexScale1, i << arrayIndexScale1.log2), kind1.getByteCount());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   634
            emitMovBytes(masm, tmp2, new AMD64Address(array2, length, arrayIndexScale2, i << arrayIndexScale2.log2), kind2.getByteCount());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   635
            masm.cmpq(tmp1, tmp2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   636
            masm.jcc(ConditionFlag.NotEqual, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   637
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   638
        masm.addq(length, elementsPerLoopIteration);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   639
        masm.jccb(ConditionFlag.NotZero, loop);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   640
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   641
        masm.bind(compareTail);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   642
        masm.testl(result, result);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   643
        masm.jcc(ConditionFlag.Zero, trueLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   644
        for (int i = 0; i < elementsPerLoopIteration - 1; i++) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   645
            emitMovBytes(masm, tmp1, new AMD64Address(array1, length, arrayIndexScale1, 0), kind1.getByteCount());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   646
            emitMovBytes(masm, tmp2, new AMD64Address(array2, length, arrayIndexScale2, 0), kind2.getByteCount());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   647
            masm.cmpq(tmp1, tmp2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   648
            masm.jcc(ConditionFlag.NotEqual, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   649
            if (i < elementsPerLoopIteration - 2) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   650
                masm.incrementq(length, 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   651
                masm.decrementq(result, 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   652
                masm.jcc(ConditionFlag.Zero, trueLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   653
            } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   654
                masm.jmpb(trueLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   655
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   656
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   657
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   658
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   659
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   660
     * Emits code to fall through if {@code src} is NaN, otherwise jump to {@code branchOrdered}.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   661
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   662
    private void emitNaNCheck(AMD64MacroAssembler masm, AMD64Address src, Label branchIfNonNaN) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   663
        assert kind1.isNumericFloat();
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   664
        Register tempXMMReg = asRegister(tempXMM);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   665
        if (kind1 == JavaKind.Float) {
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   666
            masm.movflt(tempXMMReg, src);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   667
        } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   668
            masm.movdbl(tempXMMReg, src);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   669
        }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   670
        SSEOp.UCOMIS.emit(masm, kind1 == JavaKind.Float ? OperandSize.PS : OperandSize.PD, tempXMMReg, tempXMMReg);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   671
        masm.jcc(ConditionFlag.NoParity, branchIfNonNaN);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   672
    }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   673
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   674
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   675
     * Emits code to compare if two floats are bitwise equal or both NaN.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   676
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   677
    private void emitFloatCompare(AMD64MacroAssembler masm, Register base1, Register base2, Register index, int offset, Label falseLabel,
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   678
                    boolean skipBitwiseCompare) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   679
        AMD64Address address1 = new AMD64Address(base1, index, arrayIndexScale1, offset);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   680
        AMD64Address address2 = new AMD64Address(base2, index, arrayIndexScale2, offset);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   681
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   682
        Label bitwiseEqual = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   683
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   684
        if (!skipBitwiseCompare) {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   685
            // Bitwise compare
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   686
            Register temp = asRegister(temp4);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   687
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   688
            if (kind1 == JavaKind.Float) {
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   689
                masm.movl(temp, address1);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   690
                masm.cmpl(temp, address2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   691
            } else {
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   692
                masm.movq(temp, address1);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   693
                masm.cmpq(temp, address2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   694
            }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   695
            masm.jccb(ConditionFlag.Equal, bitwiseEqual);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   696
        }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   697
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   698
        emitNaNCheck(masm, address1, falseLabel);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   699
        emitNaNCheck(masm, address2, falseLabel);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   700
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   701
        masm.bind(bitwiseEqual);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   702
    }
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   703
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   704
    /**
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   705
     * Emits code to compare float equality within a range.
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   706
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   707
    private void emitFloatCompareWithinRange(CompilationResultBuilder crb, AMD64MacroAssembler masm,
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   708
                    Register base1, Register base2, Register index, int offset, Label falseLabel, int range) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   709
        assert kind1.isNumericFloat();
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   710
        Label loop = new Label();
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   711
        Register i = asRegister(temp5);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   712
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   713
        masm.movq(i, range);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   714
        masm.negq(i);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   715
        // Align the main loop
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   716
        masm.align(crb.target.wordSize * 2);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   717
        masm.bind(loop);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   718
        emitFloatCompare(masm, base1, base2, index, offset, falseLabel, range == 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   719
        masm.incrementq(index, 1);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   720
        masm.incrementq(i, 1);
46963
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   721
        masm.jccb(ConditionFlag.NotZero, loop);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   722
        // Floats within the range are equal, revert change to the register index
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   723
        masm.subq(index, range);
089674d9949b 8186681: Update Graal
iveresov
parents: 43972
diff changeset
   724
    }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   725
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   726
    private boolean constantLengthCompareNeedsTmpArrayPointers() {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   727
        AVXKind.AVXSize vSize = vectorSize;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   728
        if (constantLength() < getElementsPerVector(vectorSize)) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   729
            vSize = AVXKind.AVXSize.XMM;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   730
        }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   731
        int vectorCount = constantLength() & ~(2 * getElementsPerVector(vSize) - 1);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   732
        return vectorCount > 0;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   733
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   734
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   735
    /**
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   736
     * Emits specialized assembly for checking equality of memory regions
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   737
     * {@code arrayPtr1[0..nBytes]} and {@code arrayPtr2[0..nBytes]}. If they match, execution
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   738
     * continues directly after the emitted code block, otherwise we jump to {@code noMatch}.
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   739
     */
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   740
    private void emitConstantLengthArrayCompareBytes(
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   741
                    CompilationResultBuilder crb,
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   742
                    AMD64MacroAssembler asm,
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   743
                    Register[] tmpVectors,
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   744
                    Label noMatch) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   745
        if (constantLength() == 0) {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   746
            // do nothing
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   747
            return;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   748
        }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   749
        Register arrayPtr1 = asRegister(array1Value);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   750
        Register arrayPtr2 = asRegister(array2Value);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   751
        Register tmp = asRegister(temp3);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   752
        AVXKind.AVXSize vSize = vectorSize;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   753
        if (constantLength() < getElementsPerVector(vectorSize)) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   754
            vSize = AVXKind.AVXSize.XMM;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   755
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   756
        int elementsPerVector = getElementsPerVector(vSize);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   757
        if (elementsPerVector > constantLength()) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   758
            assert kind1 == kind2;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   759
            int byteLength = constantLength() << arrayIndexScale1.log2;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   760
            // array is shorter than any vector register, use regular XOR instructions
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   761
            int movSize = (byteLength < 2) ? 1 : ((byteLength < 4) ? 2 : ((byteLength < 8) ? 4 : 8));
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   762
            emitMovBytes(asm, tmp, new AMD64Address(arrayPtr1, arrayBaseOffset1), movSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   763
            emitXorBytes(asm, tmp, new AMD64Address(arrayPtr2, arrayBaseOffset2), movSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   764
            asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   765
            if (byteLength > movSize) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   766
                emitMovBytes(asm, tmp, new AMD64Address(arrayPtr1, arrayBaseOffset1 + byteLength - movSize), movSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   767
                emitXorBytes(asm, tmp, new AMD64Address(arrayPtr2, arrayBaseOffset2 + byteLength - movSize), movSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   768
                asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   769
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   770
        } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   771
            int elementsPerVectorLoop = 2 * elementsPerVector;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   772
            int tailCount = constantLength() & (elementsPerVectorLoop - 1);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   773
            int vectorCount = constantLength() & ~(elementsPerVectorLoop - 1);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   774
            int bytesPerVector = vSize.getBytes();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   775
            if (vectorCount > 0) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   776
                Label loopBegin = new Label();
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   777
                Register tmpArrayPtr1 = asRegister(temp1);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   778
                Register tmpArrayPtr2 = asRegister(temp2);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   779
                asm.leaq(tmpArrayPtr1, new AMD64Address(arrayPtr1, vectorCount << arrayIndexScale1.log2));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   780
                asm.leaq(tmpArrayPtr2, new AMD64Address(arrayPtr2, vectorCount << arrayIndexScale2.log2));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   781
                arrayPtr1 = tmpArrayPtr1;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   782
                arrayPtr2 = tmpArrayPtr2;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   783
                asm.movq(tmp, -vectorCount);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   784
                asm.align(crb.target.wordSize * 2);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   785
                asm.bind(loopBegin);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   786
                emitVectorLoad1(asm, tmpVectors[0], arrayPtr1, tmp, arrayBaseOffset1, vSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   787
                emitVectorLoad2(asm, tmpVectors[1], arrayPtr2, tmp, arrayBaseOffset2, vSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   788
                emitVectorLoad1(asm, tmpVectors[2], arrayPtr1, tmp, arrayBaseOffset1 + scaleDisplacement1(bytesPerVector), vSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   789
                emitVectorLoad2(asm, tmpVectors[3], arrayPtr2, tmp, arrayBaseOffset2 + scaleDisplacement2(bytesPerVector), vSize);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   790
                emitVectorXor(asm, tmpVectors[0], tmpVectors[1], vSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   791
                emitVectorXor(asm, tmpVectors[2], tmpVectors[3], vSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   792
                emitVectorTest(asm, tmpVectors[0], vSize);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   793
                asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   794
                emitVectorTest(asm, tmpVectors[2], vSize);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   795
                asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   796
                asm.addq(tmp, elementsPerVectorLoop);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   797
                asm.jccb(AMD64Assembler.ConditionFlag.NotZero, loopBegin);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   798
            }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   799
            if (tailCount > 0) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   800
                emitVectorLoad1(asm, tmpVectors[0], arrayPtr1, arrayBaseOffset1 + (tailCount << arrayIndexScale1.log2) - scaleDisplacement1(bytesPerVector), vSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   801
                emitVectorLoad2(asm, tmpVectors[1], arrayPtr2, arrayBaseOffset2 + (tailCount << arrayIndexScale2.log2) - scaleDisplacement2(bytesPerVector), vSize);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   802
                emitVectorXor(asm, tmpVectors[0], tmpVectors[1], vSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   803
                if (tailCount > elementsPerVector) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   804
                    emitVectorLoad1(asm, tmpVectors[2], arrayPtr1, arrayBaseOffset1, vSize);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   805
                    emitVectorLoad2(asm, tmpVectors[3], arrayPtr2, arrayBaseOffset2, vSize);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   806
                    emitVectorXor(asm, tmpVectors[2], tmpVectors[3], vSize);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   807
                    emitVectorTest(asm, tmpVectors[2], vSize);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   808
                    asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   809
                }
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   810
                emitVectorTest(asm, tmpVectors[0], vSize);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   811
                asm.jccb(AMD64Assembler.ConditionFlag.NotZero, noMatch);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   812
            }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   813
        }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   814
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   815
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   816
    private void emitMovBytes(AMD64MacroAssembler asm, Register dst, AMD64Address src, int size) {
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   817
        switch (size) {
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   818
            case 1:
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   819
                if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   820
                    asm.movsbq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   821
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   822
                    asm.movzbq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   823
                }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   824
                break;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   825
            case 2:
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   826
                if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   827
                    asm.movswq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   828
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   829
                    asm.movzwq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   830
                }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   831
                break;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   832
            case 4:
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   833
                if (signExtend) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   834
                    asm.movslq(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   835
                } else {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   836
                    // there is no movzlq
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   837
                    asm.movl(dst, src);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   838
                }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   839
                break;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   840
            case 8:
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   841
                asm.movq(dst, src);
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   842
                break;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   843
            default:
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   844
                throw new IllegalStateException();
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   845
        }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   846
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   847
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   848
    private static void emitXorBytes(AMD64MacroAssembler asm, Register dst, AMD64Address src, int size) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   849
        OperandSize opSize = getOperandSize(size);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   850
        XOR.getRMOpcode(opSize).emit(asm, opSize, dst, src);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   851
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   852
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   853
    private static OperandSize getOperandSize(int size) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   854
        switch (size) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   855
            case 1:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   856
                return OperandSize.BYTE;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   857
            case 2:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   858
                return OperandSize.WORD;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   859
            case 4:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   860
                return OperandSize.DWORD;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   861
            case 8:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   862
                return OperandSize.QWORD;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   863
            default:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54084
diff changeset
   864
                throw new IllegalStateException();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   865
        }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
   866
    }
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58299
diff changeset
   867
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58299
diff changeset
   868
    @Override
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58299
diff changeset
   869
    public boolean needsClearUpperVectorRegisters() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58299
diff changeset
   870
        return true;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58299
diff changeset
   871
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   872
}