src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64MacroAssembler.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58533 46b0b7fe255c
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
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
/*
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
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
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    23
50858
2d3e99a72541 8205824: Update Graal
never
parents: 50609
diff changeset
    24
2d3e99a72541 8205824: Update Graal
never
parents: 50609
diff changeset
    25
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
package org.graalvm.compiler.asm.aarch64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    28
import static jdk.vm.ci.aarch64.AArch64.CPU;
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    29
import static jdk.vm.ci.aarch64.AArch64.rscratch1;
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    30
import static jdk.vm.ci.aarch64.AArch64.rscratch2;
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    31
import static jdk.vm.ci.aarch64.AArch64.sp;
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    32
import static jdk.vm.ci.aarch64.AArch64.zr;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import static org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode.BASE_REGISTER_ONLY;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import static org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode.EXTENDED_REGISTER_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import static org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode.IMMEDIATE_SCALED;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import static org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode.IMMEDIATE_UNSCALED;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import static org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode.REGISTER_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import static org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.AddressGenerationPlan.WorkPlan.ADD_TO_BASE;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import static org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.AddressGenerationPlan.WorkPlan.ADD_TO_INDEX;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import static org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler.AddressGenerationPlan.WorkPlan.NO_WORK;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    41
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    42
import org.graalvm.compiler.asm.BranchTargetOutOfBoundsException;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.asm.Label;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    44
import org.graalvm.compiler.core.common.NumUtil;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import org.graalvm.compiler.debug.GraalError;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import jdk.vm.ci.aarch64.AArch64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import jdk.vm.ci.code.Register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import jdk.vm.ci.code.TargetDescription;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
public class AArch64MacroAssembler extends AArch64Assembler {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
    53
    private final ScratchRegister[] scratchRegister = new ScratchRegister[]{new ScratchRegister(rscratch1), new ScratchRegister(rscratch2)};
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
    // Points to the next free scratch register
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
    private int nextFreeScratchRegister = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
    public AArch64MacroAssembler(TargetDescription target) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
        super(target);
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
    public class ScratchRegister implements AutoCloseable {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
        private final Register register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
        public ScratchRegister(Register register) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
            this.register = register;
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
        public Register getRegister() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
            return register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
        @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
        public void close() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
            assert nextFreeScratchRegister > 0 : "Close called too often";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
            nextFreeScratchRegister--;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    77
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
    public ScratchRegister getScratchRegister() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
        return scratchRegister[nextFreeScratchRegister++];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
     * Specifies what actions have to be taken to turn an arbitrary address of the form
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
     * {@code base + displacement [+ index [<< scale]]} into a valid AArch64Address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
    public static class AddressGenerationPlan {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
        public final WorkPlan workPlan;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
        public final AArch64Address.AddressingMode addressingMode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
        public final boolean needsScratch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
        public enum WorkPlan {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
            /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
             * Can be used as-is without extra work.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
             */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
            NO_WORK,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
            /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
             * Add scaled displacement to index register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
             */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
            ADD_TO_INDEX,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
            /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
             * Add unscaled displacement to base register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
             */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
            ADD_TO_BASE,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
         * @param workPlan Work necessary to generate a valid address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
         * @param addressingMode Addressing mode of generated address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
         * @param needsScratch True if generating address needs a scatch register, false otherwise.
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
        public AddressGenerationPlan(WorkPlan workPlan, AArch64Address.AddressingMode addressingMode, boolean needsScratch) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
            this.workPlan = workPlan;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
            this.addressingMode = addressingMode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
            this.needsScratch = needsScratch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
     * Generates an addressplan for an address of the form
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
     * {@code base + displacement [+ index [<< log2(transferSize)]]} with the index register and
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
     * scaling being optional.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
     * @param displacement an arbitrary displacement.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
     * @param hasIndexRegister true if the address uses an index register, false otherwise. non null
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
     * @param transferSize the memory transfer size in bytes. The log2 of this specifies how much
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
     *            the index register is scaled. If 0 no scaling is assumed. Can be 0, 1, 2, 4 or 8.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
     * @return AddressGenerationPlan that specifies the actions necessary to generate a valid
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
     *         AArch64Address for the given parameters.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
    public static AddressGenerationPlan generateAddressPlan(long displacement, boolean hasIndexRegister, int transferSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
        assert transferSize == 0 || transferSize == 1 || transferSize == 2 || transferSize == 4 || transferSize == 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
        boolean indexScaled = transferSize != 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
        int log2Scale = NumUtil.log2Ceil(transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
        long scaledDisplacement = displacement >> log2Scale;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
        boolean displacementScalable = indexScaled && (displacement & (transferSize - 1)) == 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
        if (displacement == 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
            // register offset without any work beforehand.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
            return new AddressGenerationPlan(NO_WORK, REGISTER_OFFSET, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
            if (hasIndexRegister) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
                if (displacementScalable) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
                    boolean needsScratch = !isArithmeticImmediate(scaledDisplacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
                    return new AddressGenerationPlan(ADD_TO_INDEX, REGISTER_OFFSET, needsScratch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
                    boolean needsScratch = !isArithmeticImmediate(displacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
                    return new AddressGenerationPlan(ADD_TO_BASE, REGISTER_OFFSET, needsScratch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
            } else {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   151
                if (displacementScalable && NumUtil.isUnsignedNbit(12, scaledDisplacement)) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   152
                    return new AddressGenerationPlan(NO_WORK, IMMEDIATE_SCALED, false);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
   153
                } else if (NumUtil.isSignedNbit(9, displacement)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
                    return new AddressGenerationPlan(NO_WORK, IMMEDIATE_UNSCALED, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
                    boolean needsScratch = !isArithmeticImmediate(displacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
                    return new AddressGenerationPlan(ADD_TO_BASE, REGISTER_OFFSET, needsScratch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
    }
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
     * Returns an AArch64Address pointing to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
     * {@code base + displacement + index << log2(transferSize)}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
     * @param base general purpose register. May not be null or the zero register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
     * @param displacement arbitrary displacement added to base.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
     * @param index general purpose register. May not be null or the stack pointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
     * @param signExtendIndex if true consider index register a word register that should be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
     *            sign-extended before being added.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
     * @param transferSize the memory transfer size in bytes. The log2 of this specifies how much
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
     *            the index register is scaled. If 0 no scaling is assumed. Can be 0, 1, 2, 4 or 8.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
     * @param additionalReg additional register used either as a scratch register or as part of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
     *            final address, depending on whether allowOverwrite is true or not. May not be null
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
     *            or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
     * @param allowOverwrite if true allows to change value of base or index register to generate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
     *            address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
     * @return AArch64Address pointing to memory at
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
     *         {@code base + displacement + index << log2(transferSize)}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
    public AArch64Address makeAddress(Register base, long displacement, Register index, boolean signExtendIndex, int transferSize, Register additionalReg, boolean allowOverwrite) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   183
        AddressGenerationPlan plan = generateAddressPlan(displacement, !index.equals(zr), transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   184
        assert allowOverwrite || !zr.equals(additionalReg) || plan.workPlan == NO_WORK;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
        assert !plan.needsScratch || !zr.equals(additionalReg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   186
        int log2Scale = NumUtil.log2Ceil(transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
        long scaledDisplacement = displacement >> log2Scale;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   188
        Register newIndex = index;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   189
        Register newBase = base;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   190
        int immediate;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
        switch (plan.workPlan) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
            case NO_WORK:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
                if (plan.addressingMode == IMMEDIATE_SCALED) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
                    immediate = (int) scaledDisplacement;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   195
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
                    immediate = (int) displacement;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   197
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
            case ADD_TO_INDEX:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   200
                newIndex = allowOverwrite ? index : additionalReg;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   201
                assert !newIndex.equals(sp) && !newIndex.equals(zr);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
                if (plan.needsScratch) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   203
                    mov(additionalReg, scaledDisplacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   204
                    add(signExtendIndex ? 32 : 64, newIndex, index, additionalReg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
                    add(signExtendIndex ? 32 : 64, newIndex, index, (int) scaledDisplacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   207
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   208
                immediate = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   209
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   210
            case ADD_TO_BASE:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   211
                newBase = allowOverwrite ? base : additionalReg;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   212
                assert !newBase.equals(sp) && !newBase.equals(zr);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
                if (plan.needsScratch) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   214
                    mov(additionalReg, displacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   215
                    add(64, newBase, base, additionalReg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   216
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   217
                    add(64, newBase, base, (int) displacement);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   218
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   219
                immediate = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   220
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   221
            default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   222
                throw GraalError.shouldNotReachHere();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   223
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   224
        AArch64Address.AddressingMode addressingMode = plan.addressingMode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   225
        ExtendType extendType = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   226
        if (addressingMode == REGISTER_OFFSET) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   227
            if (newIndex.equals(zr)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
                addressingMode = BASE_REGISTER_ONLY;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
            } else if (signExtendIndex) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   230
                addressingMode = EXTENDED_REGISTER_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
                extendType = ExtendType.SXTW;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
            }
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
        return AArch64Address.createAddress(addressingMode, newBase, newIndex, immediate, transferSize != 0, extendType);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   235
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   236
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
     * Returns an AArch64Address pointing to {@code base + displacement}. Specifies the memory
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   239
     * transfer size to allow some optimizations when building the address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   240
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
     * @param base general purpose register. May not be null or the zero register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   242
     * @param displacement arbitrary displacement added to base.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
     * @param transferSize the memory transfer size in bytes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   244
     * @param additionalReg additional register used either as a scratch register or as part of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   245
     *            final address, depending on whether allowOverwrite is true or not. May not be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
     *            null, zero register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   247
     * @param allowOverwrite if true allows to change value of base or index register to generate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
     *            address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
     * @return AArch64Address pointing to memory at {@code base + displacement}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   250
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
    public AArch64Address makeAddress(Register base, long displacement, Register additionalReg, int transferSize, boolean allowOverwrite) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
        assert additionalReg.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
        return makeAddress(base, displacement, zr, /* sign-extend */false, transferSize, additionalReg, allowOverwrite);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   255
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   256
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
     * Returns an AArch64Address pointing to {@code base + displacement}. Fails if address cannot be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
     * represented without overwriting base register or using a scratch register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
     * @param base general purpose register. May not be null or the zero register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
     * @param displacement arbitrary displacement added to base.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
     * @param transferSize the memory transfer size in bytes. The log2 of this specifies how much
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
     *            the index register is scaled. If 0 no scaling is assumed. Can be 0, 1, 2, 4 or 8.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   264
     * @return AArch64Address pointing to memory at {@code base + displacement}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
    public AArch64Address makeAddress(Register base, long displacement, int transferSize) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   267
        return makeAddress(base, displacement, zr, /* signExtend */false, //
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   268
                        transferSize, zr, /* allowOverwrite */false);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   271
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   272
     * Loads memory address into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
     * @param dst general purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
     * @param address address whose value is loaded into dst. May not be null,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
     *            {@link org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode#IMMEDIATE_POST_INDEXED
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   277
     *            POST_INDEXED} or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   278
     *            {@link org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode#IMMEDIATE_PRE_INDEXED
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   279
     *            IMMEDIATE_PRE_INDEXED}
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   280
     * @param transferSize the memory transfer size in bytes. The log2 of this specifies how much
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
     *            the index register is scaled. Can be 1, 2, 4 or 8.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
    public void loadAddress(Register dst, AArch64Address address, int transferSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
        assert transferSize == 1 || transferSize == 2 || transferSize == 4 || transferSize == 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
        assert dst.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
        int shiftAmt = NumUtil.log2Ceil(transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
        switch (address.getAddressingMode()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
            case IMMEDIATE_SCALED:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
                int scaledImmediate = address.getImmediateRaw() << shiftAmt;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
                int lowerBits = scaledImmediate & NumUtil.getNbitNumberInt(12);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
                int higherBits = scaledImmediate & ~NumUtil.getNbitNumberInt(12);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
                boolean firstAdd = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
                if (lowerBits != 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
                    add(64, dst, address.getBase(), lowerBits);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
                    firstAdd = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
                if (higherBits != 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
                    Register src = firstAdd ? address.getBase() : dst;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
                    add(64, dst, src, higherBits);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   300
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   301
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   302
            case IMMEDIATE_UNSCALED:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   303
                int immediate = address.getImmediateRaw();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   304
                add(64, dst, address.getBase(), immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
            case REGISTER_OFFSET:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   307
                add(64, dst, address.getBase(), address.getOffset(), ShiftType.LSL, address.isScaled() ? shiftAmt : 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   308
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   309
            case EXTENDED_REGISTER_OFFSET:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   310
                add(64, dst, address.getBase(), address.getOffset(), address.getExtendType(), address.isScaled() ? shiftAmt : 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   311
                break;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   312
            case PC_LITERAL: {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   313
                addressOf(dst);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
                break;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   315
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
            case BASE_REGISTER_ONLY:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   317
                movx(dst, address.getBase());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   318
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   319
            default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   320
                throw GraalError.shouldNotReachHere();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   321
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   322
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   324
    public void movx(Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   325
        mov(64, dst, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   326
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
    public void mov(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
        if (dst.equals(sp) || src.equals(sp)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
            add(size, dst, src, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
            or(size, dst, zr, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   335
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   336
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   337
     * Generates a 64-bit immediate move code sequence.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   340
     * @param imm the value to move into the register
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   341
     * @param annotateImm Flag denoting if annotation should be added.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
     */
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   343
    private void mov64(Register dst, long imm, boolean annotateImm) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   344
        // We have to move all non zero parts of the immediate in 16-bit chunks
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   345
        int numMovs = 0;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   346
        int pos = position();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   347
        boolean firstMove = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   348
        for (int offset = 0; offset < 64; offset += 16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   349
            int chunk = (int) (imm >> offset) & NumUtil.getNbitNumberInt(16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   350
            if (chunk == 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   351
                continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   352
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   353
            if (firstMove) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
                movz(64, dst, chunk, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   355
                firstMove = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   356
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   357
                movk(64, dst, chunk, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   358
            }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   359
            ++numMovs;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   360
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   361
        assert !firstMove;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   362
        if (annotateImm) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   363
            annotateImmediateMovSequence(pos, numMovs);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   364
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   365
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   366
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   367
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   368
     * Loads immediate into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   369
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   370
     * @param dst general purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   371
     * @param imm immediate loaded into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   372
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   373
    public void mov(Register dst, long imm) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   374
        mov(dst, imm, false);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   375
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   376
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   377
    /**
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   378
     * Loads immediate into register.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   379
     *
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   380
     * @param dst general purpose register. May not be null, zero-register or stackpointer.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   381
     * @param imm immediate loaded into register.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   382
     * @param annotateImm Flag to signal of the immediate value should be annotated.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   383
     */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   384
    public void mov(Register dst, long imm, boolean annotateImm) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   385
        assert dst.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   386
        if (imm == 0L) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   387
            movx(dst, zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   388
        } else if (LogicalImmediateTable.isRepresentable(true, imm) != LogicalImmediateTable.Representable.NO) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   389
            or(64, dst, zr, imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   390
        } else if (imm >> 32 == -1L && (int) imm < 0 && LogicalImmediateTable.isRepresentable((int) imm) != LogicalImmediateTable.Representable.NO) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   391
            // If the higher 32-bit are 1s and the sign bit of the lower 32-bits is set *and* we can
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   392
            // represent the lower 32 bits as a logical immediate we can create the lower 32-bit and
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   393
            // then sign extend
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   394
            // them. This allows us to cover immediates like ~1L with 2 instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   395
            mov(dst, (int) imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   396
            sxt(64, 32, dst, dst);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   397
        } else {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   398
            mov64(dst, imm, annotateImm);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   399
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   400
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   401
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   402
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   403
     * Loads immediate into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   404
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   405
     * @param dst general purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   406
     * @param imm immediate loaded into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   407
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   408
    public void mov(Register dst, int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   409
        mov(dst, imm & 0xFFFF_FFFFL);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   410
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   411
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   412
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   413
     * Generates a 48-bit immediate move code sequence. The immediate may later be updated by
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   414
     * HotSpot.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   415
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   416
     * In AArch64 mode the virtual address space is 48-bits in size, so we only need three
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   417
     * instructions to create a patchable instruction sequence that can reach anywhere.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   418
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   419
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   420
     * @param imm
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   421
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   422
    public void movNativeAddress(Register dst, long imm) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   423
        movNativeAddress(dst, imm, false);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   424
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   425
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   426
    /**
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   427
     * Generates a 48-bit immediate move code sequence. The immediate may later be updated by
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   428
     * HotSpot.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   429
     *
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   430
     * In AArch64 mode the virtual address space is 48-bits in size, so we only need three
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   431
     * instructions to create a patchable instruction sequence that can reach anywhere.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   432
     *
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   433
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   434
     * @param imm The immediate address
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   435
     * @param annotateImm Flag to signal of the immediate value should be annotated.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   436
     */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   437
    public void movNativeAddress(Register dst, long imm, boolean annotateImm) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   438
        assert (imm & 0xFFFF_0000_0000_0000L) == 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   439
        // We have to move all non zero parts of the immediate in 16-bit chunks
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   440
        boolean firstMove = true;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   441
        int pos = position();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   442
        for (int offset = 0; offset < 48; offset += 16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   443
            int chunk = (int) (imm >> offset) & NumUtil.getNbitNumberInt(16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   444
            if (firstMove) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   445
                movz(64, dst, chunk, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   446
                firstMove = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   447
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   448
                movk(64, dst, chunk, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   449
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   450
        }
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   451
        if (annotateImm) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   452
            annotateImmediateMovSequence(pos, 3);
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   453
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   454
        assert !firstMove;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   455
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   456
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
    /**
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   458
     * Generates a 32-bit immediate move code sequence. The immediate may later be updated by
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   459
     * HotSpot.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   460
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   461
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   462
     * @param imm
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   463
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   464
    public void movNarrowAddress(Register dst, long imm) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   465
        assert (imm & 0xFFFF_FFFF_0000_0000L) == 0;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   466
        movz(64, dst, (int) (imm >>> 16), 16);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   467
        movk(64, dst, (int) (imm & 0xffff), 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   468
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   469
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   470
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   471
     * @return Number of instructions necessary to load immediate into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   472
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   473
    public static int nrInstructionsToMoveImmediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   474
        if (imm == 0L || LogicalImmediateTable.isRepresentable(true, imm) != LogicalImmediateTable.Representable.NO) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   475
            return 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   476
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   477
        if (imm >> 32 == -1L && (int) imm < 0 && LogicalImmediateTable.isRepresentable((int) imm) != LogicalImmediateTable.Representable.NO) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   478
            // If the higher 32-bit are 1s and the sign bit of the lower 32-bits is set *and* we can
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   479
            // represent the lower 32 bits as a logical immediate we can create the lower 32-bit and
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   480
            // then sign extend
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   481
            // them. This allows us to cover immediates like ~1L with 2 instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   482
            return 2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   483
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   484
        int nrInstructions = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   485
        for (int offset = 0; offset < 64; offset += 16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   486
            int part = (int) (imm >> offset) & NumUtil.getNbitNumberInt(16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   487
            if (part != 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   488
                nrInstructions++;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   489
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   490
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   491
        return nrInstructions;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   492
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   493
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   494
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   495
     * Loads a srcSize value from address into rt sign-extending it if necessary.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   496
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   497
     * @param targetSize size of target register in bits. Must be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   498
     * @param srcSize size of memory read in bits. Must be 8, 16 or 32 and smaller or equal to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   499
     *            targetSize.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   500
     * @param rt general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   501
     * @param address all addressing modes allowed. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   502
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   503
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   504
    public void ldrs(int targetSize, int srcSize, Register rt, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   505
        assert targetSize == 32 || targetSize == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   506
        assert srcSize <= targetSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   507
        if (targetSize == srcSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   508
            super.ldr(srcSize, rt, address);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   509
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   510
            super.ldrs(targetSize, srcSize, rt, address);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   511
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   512
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   513
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   514
    /**
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   515
     * Loads a srcSize value from address into rt zero-extending it if necessary.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   516
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   517
     * @param srcSize size of memory read in bits. Must be 8, 16 or 32 and smaller or equal to
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   518
     *            targetSize.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   519
     * @param rt general purpose register. May not be null or stackpointer.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   520
     * @param address all addressing modes allowed. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   521
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   522
    @Override
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   523
    public void ldr(int srcSize, Register rt, AArch64Address address) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   524
        super.ldr(srcSize, rt, address);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   525
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   526
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   527
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   528
     * Conditional move. dst = src1 if condition else src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   529
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   530
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   531
     * @param result general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   532
     * @param trueValue general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   533
     * @param falseValue general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   534
     * @param cond any condition flag. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   535
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   536
    public void cmov(int size, Register result, Register trueValue, Register falseValue, ConditionFlag cond) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   537
        super.csel(size, result, trueValue, falseValue, cond);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   538
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   539
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   540
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
     * Conditional set. dst = 1 if condition else 0.
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
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   544
     * @param condition any condition. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   545
     */
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   546
    public void cset(int size, Register dst, ConditionFlag condition) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   547
        super.csinc(size, dst, zr, zr, condition.negate());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   548
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   549
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   550
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   551
     * dst = src1 + src2.
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
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   554
     * @param dst general purpose register. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   555
     * @param src1 general purpose register. May not be null.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   556
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   557
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   558
    public void add(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   559
        if (dst.equals(sp) || src1.equals(sp)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   560
            super.add(size, dst, src1, src2, ExtendType.UXTX, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   561
        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   562
            super.add(size, dst, src1, src2, ShiftType.LSL, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   563
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   564
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   565
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   566
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   567
     * dst = src1 + src2 and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   568
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   569
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   570
     * @param dst general purpose register. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   571
     * @param src1 general purpose register. May not be null.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   574
    public void adds(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   575
        if (dst.equals(sp) || src1.equals(sp)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   576
            super.adds(size, dst, src1, src2, ExtendType.UXTX, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   577
        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   578
            super.adds(size, dst, src1, src2, ShiftType.LSL, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   579
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   580
    }
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   583
     * dst = src1 - src2 and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   584
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   585
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   586
     * @param dst general purpose register. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   587
     * @param src1 general purpose register. May not be null.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   588
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   589
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   590
    public void subs(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   591
        if (dst.equals(sp) || src1.equals(sp)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   592
            super.subs(size, dst, src1, src2, ExtendType.UXTX, 0);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   593
        } else {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   594
            super.subs(size, dst, src1, src2, ShiftType.LSL, 0);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   595
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   596
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   597
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
     * dst = src1 - src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   600
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   601
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   602
     * @param dst general purpose register. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   603
     * @param src1 general purpose register. May not be null.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   604
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   605
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   606
    public void sub(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   607
        if (dst.equals(sp) || src1.equals(sp)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   608
            super.sub(size, dst, src1, src2, ExtendType.UXTX, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   609
        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   610
            super.sub(size, dst, src1, src2, ShiftType.LSL, 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   611
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   612
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   613
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   614
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   615
     * dst = src1 + shiftType(src2, shiftAmt & (size - 1)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   616
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   617
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   618
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   619
     * @param src1 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   620
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   621
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   622
     * @param shiftAmt arbitrary shift amount.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   623
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   624
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   625
    public void add(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   626
        int shift = clampShiftAmt(size, shiftAmt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   627
        super.add(size, dst, src1, src2, shiftType, shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   628
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   629
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   630
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   631
     * dst = src1 + shiftType(src2, shiftAmt & (size-1)) and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   632
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   633
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   634
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   635
     * @param src1 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   636
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   637
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   638
     * @param shiftAmt arbitrary shift amount.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   639
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   640
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   641
    public void sub(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   642
        int shift = clampShiftAmt(size, shiftAmt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   643
        super.sub(size, dst, src1, src2, shiftType, shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   644
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   645
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   646
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   647
     * dst = -src1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   648
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   649
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   650
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   651
     * @param src general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   652
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   653
    public void neg(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   654
        sub(size, dst, zr, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   655
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   656
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   657
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   658
     * dst = src + immediate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   659
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   660
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   661
     * @param dst general purpose register. May not be null or zero-register.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   662
     * @param src general purpose register. May not be null or zero-register.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   663
     * @param immediate 32-bit signed int
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   664
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   665
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   666
    public void add(int size, Register dst, Register src, int immediate) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   667
        assert (!dst.equals(zr) && !src.equals(zr));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   668
        if (immediate < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   669
            sub(size, dst, src, -immediate);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   670
        } else if (isAimm(immediate)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   671
            if (!(dst.equals(src) && immediate == 0)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   672
                super.add(size, dst, src, immediate);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   673
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   674
        } else if (immediate >= -(1 << 24) && immediate < (1 << 24)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   675
            super.add(size, dst, src, immediate & -(1 << 12));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   676
            super.add(size, dst, dst, immediate & ((1 << 12) - 1));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   677
        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   678
            assert !dst.equals(src);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   679
            mov(dst, immediate);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   680
            add(size, src, dst, dst);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   681
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   682
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   683
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   684
    /**
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   685
     * dst = src + immediate.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   686
     *
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   687
     * @param size register size. Has to be 32 or 64.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   688
     * @param dst general purpose register. May not be null or zero-register.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   689
     * @param src general purpose register. May not be null or zero-register.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   690
     * @param immediate 64-bit signed int
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   691
     */
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   692
    public void add(int size, Register dst, Register src, long immediate) {
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   693
        if (NumUtil.isInt(immediate)) {
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   694
            add(size, dst, src, (int) immediate);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   695
        } else {
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   696
            assert (!dst.equals(zr) && !src.equals(zr));
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   697
            assert !dst.equals(src);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   698
            assert size == 64;
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   699
            mov(dst, immediate);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   700
            add(size, src, dst, dst);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   701
        }
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   702
    }
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   703
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   704
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   705
     * dst = src + aimm and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   706
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   707
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   708
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   709
     * @param src general purpose register. May not be null or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   710
     * @param immediate arithmetic immediate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   711
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   712
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   713
    public void adds(int size, Register dst, Register src, int immediate) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   714
        assert (!dst.equals(sp) && !src.equals(zr));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   715
        if (immediate < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   716
            subs(size, dst, src, -immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   717
        } else if (!(dst.equals(src) && immediate == 0)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   718
            super.adds(size, dst, src, immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   719
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   720
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   721
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   722
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   723
     * dst = src - immediate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   724
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   725
     * @param size register size. Has to be 32 or 64.
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   726
     * @param dst general purpose register. May not be null or zero-register.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   727
     * @param src general purpose register. May not be null or zero-register.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   728
     * @param immediate 32-bit signed int
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   729
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   730
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   731
    public void sub(int size, Register dst, Register src, int immediate) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   732
        assert (!dst.equals(zr) && !src.equals(zr));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   733
        if (immediate < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   734
            add(size, dst, src, -immediate);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   735
        } else if (isAimm(immediate)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   736
            if (!(dst.equals(src) && immediate == 0)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   737
                super.sub(size, dst, src, immediate);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   738
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   739
        } else if (immediate >= -(1 << 24) && immediate < (1 << 24)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   740
            super.sub(size, dst, src, immediate & -(1 << 12));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   741
            super.sub(size, dst, dst, immediate & ((1 << 12) - 1));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   742
        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   743
            assert !dst.equals(src);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   744
            mov(dst, immediate);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   745
            sub(size, src, dst, dst);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   746
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   747
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   748
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   749
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   750
     * dst = src - aimm and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   751
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   752
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   753
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   754
     * @param src general purpose register. May not be null or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   755
     * @param immediate arithmetic immediate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   756
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   757
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   758
    public void subs(int size, Register dst, Register src, int immediate) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   759
        assert (!dst.equals(sp) && !src.equals(zr));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   760
        if (immediate < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   761
            adds(size, dst, src, -immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   762
        } else if (!dst.equals(src) || immediate != 0) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   763
            super.subs(size, dst, src, immediate);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   764
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   765
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   766
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   767
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   768
     * dst = src1 * src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   769
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   770
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   771
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   772
     * @param src1 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   773
     * @param src2 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   774
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   775
    public void mul(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   776
        super.madd(size, dst, src1, src2, zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   777
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   778
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   779
    /**
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   780
     * dst = src3 + src1 * src2.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   781
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   782
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   783
     * @param dst general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   784
     * @param src1 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   785
     * @param src2 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   786
     * @param src3 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   787
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   788
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   789
    public void madd(int size, Register dst, Register src1, Register src2, Register src3) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   790
        super.madd(size, dst, src1, src2, src3);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   791
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   792
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   793
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   794
     * dst = src3 - src1 * src2.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   795
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   796
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   797
     * @param dst general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   798
     * @param src1 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   799
     * @param src2 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   800
     * @param src3 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   801
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   802
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   803
    public void msub(int size, Register dst, Register src1, Register src2, Register src3) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   804
        super.msub(size, dst, src1, src2, src3);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   805
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   806
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   807
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   808
     * dst = 0 - src1 * src2.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   809
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   810
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   811
     * @param dst general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   812
     * @param src1 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   813
     * @param src2 general purpose register. May not be null or the stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   814
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   815
    public void mneg(int size, Register dst, Register src1, Register src2) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   816
        super.msub(size, dst, src1, src2, zr);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   817
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   818
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   819
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   820
     * unsigned multiply high. dst = (src1 * src2) >> size
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   821
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   822
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   823
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   824
     * @param src1 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   825
     * @param src2 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   826
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   827
    public void umulh(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   828
        assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   829
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   830
        if (size == 64) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   831
            super.umulh(dst, src1, src2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   832
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   833
            // xDst = wSrc1 * wSrc2
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   834
            super.umaddl(dst, src1, src2, zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   835
            // xDst = xDst >> 32
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   836
            lshr(64, dst, dst, 32);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   837
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   838
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   839
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   840
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   841
     * signed multiply high. dst = (src1 * src2) >> size
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   842
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   843
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   844
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   845
     * @param src1 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   846
     * @param src2 general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   847
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   848
    public void smulh(int size, Register dst, Register src1, Register src2) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   849
        assert (!dst.equals(sp) && !src1.equals(sp) && !src2.equals(sp));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   850
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   851
        if (size == 64) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   852
            super.smulh(dst, src1, src2);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   853
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   854
            // xDst = wSrc1 * wSrc2
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   855
            super.smaddl(dst, src1, src2, zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   856
            // xDst = xDst >> 32
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   857
            lshr(64, dst, dst, 32);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   858
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   859
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   860
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   861
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   862
     * dst = src1 % src2. Signed.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   863
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   864
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   865
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   866
     * @param n numerator. General purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   867
     * @param d denominator. General purpose register. Divisor May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   868
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   869
    public void rem(int size, Register dst, Register n, Register d) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   870
        assert (!dst.equals(sp) && !n.equals(sp) && !d.equals(sp));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   871
        // There is no irem or similar instruction. Instead we use the relation:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   872
        // n % d = n - Floor(n / d) * d if nd >= 0
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   873
        // n % d = n - Ceil(n / d) * d else
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   874
        // Which is equivalent to n - TruncatingDivision(n, d) * d
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   875
        super.sdiv(size, dst, n, d);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   876
        super.msub(size, dst, dst, d, n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   877
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   878
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   879
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   880
     * dst = src1 % src2. Unsigned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   881
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   882
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   883
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   884
     * @param n numerator. General purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   885
     * @param d denominator. General purpose register. Divisor May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   886
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   887
    public void urem(int size, Register dst, Register n, Register d) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   888
        // There is no irem or similar instruction. Instead we use the relation:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   889
        // n % d = n - Floor(n / d) * d
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   890
        // Which is equivalent to n - TruncatingDivision(n, d) * d
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   891
        super.udiv(size, dst, n, d);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   892
        super.msub(size, dst, dst, d, n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   893
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   894
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   895
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   896
     * Add/subtract instruction encoding supports 12-bit immediate values.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   897
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   898
     * @param imm immediate value to be tested.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   899
     * @return true if immediate can be used directly for arithmetic instructions (add/sub), false
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   900
     *         otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   901
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   902
    public static boolean isArithmeticImmediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   903
        // If we have a negative immediate we just use the opposite operator. I.e.: x - (-5) == x +
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   904
        // 5.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   905
        return NumUtil.isInt(Math.abs(imm)) && isAimm((int) Math.abs(imm));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   906
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   907
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   908
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   909
     * Compare instructions are add/subtract instructions and so support 12-bit immediate values.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   910
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   911
     * @param imm immediate value to be tested.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   912
     * @return true if immediate can be used directly with comparison instructions, false otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   913
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   914
    public static boolean isComparisonImmediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   915
        return isArithmeticImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   916
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   917
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   918
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   919
     * Move wide immediate instruction encoding supports 16-bit immediate values which can be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   920
     * optionally-shifted by multiples of 16 (i.e. 0, 16, 32, 48).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   921
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   922
     * @return true if immediate can be moved directly into a register, false otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   923
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   924
    public static boolean isMovableImmediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   925
        // // Positions of first, respectively last set bit.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   926
        // int start = Long.numberOfTrailingZeros(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   927
        // int end = 64 - Long.numberOfLeadingZeros(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   928
        // int length = end - start;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   929
        // if (length > 16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   930
        // return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   931
        // }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   932
        // // We can shift the necessary part of the immediate (i.e. everything between the first
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   933
        // and
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   934
        // // last set bit) by as much as 16 - length around to arrive at a valid shift amount
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   935
        // int tolerance = 16 - length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   936
        // int prevMultiple = NumUtil.roundDown(start, 16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   937
        // int nextMultiple = NumUtil.roundUp(start, 16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   938
        // return start - prevMultiple <= tolerance || nextMultiple - start <= tolerance;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   939
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   940
         * This is a bit optimistic because the constant could also be for an arithmetic instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   941
         * which only supports 12-bits. That case needs to be handled in the backend.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   942
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   943
        return NumUtil.isInt(Math.abs(imm)) && NumUtil.isUnsignedNbit(16, (int) Math.abs(imm));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   944
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   945
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   946
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   947
     * dst = src << (shiftAmt & (size - 1)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   948
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   949
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   950
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   951
     * @param src general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   952
     * @param shiftAmt amount by which src is shifted.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   953
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   954
    public void shl(int size, Register dst, Register src, long shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   955
        int shift = clampShiftAmt(size, shiftAmt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   956
        super.ubfm(size, dst, src, (size - shift) & (size - 1), size - 1 - shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   957
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   958
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   959
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   960
     * dst = src1 << (src2 & (size - 1)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   961
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   962
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   963
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   964
     * @param src general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   965
     * @param shift general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   966
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   967
    public void shl(int size, Register dst, Register src, Register shift) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   968
        super.lsl(size, dst, src, shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   969
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   970
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   971
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   972
     * dst = src >>> (shiftAmt & (size - 1)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   973
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   974
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   975
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   976
     * @param src general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   977
     * @param shiftAmt amount by which src is shifted.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   978
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   979
    public void lshr(int size, Register dst, Register src, long shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   980
        int shift = clampShiftAmt(size, shiftAmt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   981
        super.ubfm(size, dst, src, shift, size - 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   982
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   983
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   984
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   985
     * dst = src1 >>> (src2 & (size - 1)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   986
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   987
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   988
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   989
     * @param src general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   990
     * @param shift general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   991
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   992
    public void lshr(int size, Register dst, Register src, Register shift) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   993
        super.lsr(size, dst, src, shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   994
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   995
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   996
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   997
     * dst = src >> (shiftAmt & log2(size)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   998
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   999
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1000
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1001
     * @param src general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1002
     * @param shiftAmt amount by which src is shifted.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1003
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1004
    public void ashr(int size, Register dst, Register src, long shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1005
        int shift = clampShiftAmt(size, shiftAmt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1006
        super.sbfm(size, dst, src, shift, size - 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1007
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1008
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1009
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1010
     * dst = src1 >> (src2 & log2(size)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1011
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1012
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1013
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1014
     * @param src general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1015
     * @param shift general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1016
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1017
    public void ashr(int size, Register dst, Register src, Register shift) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1018
        super.asr(size, dst, src, shift);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1019
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1020
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1021
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1022
     * Clamps shiftAmt into range 0 <= shiftamt < size according to JLS.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1023
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1024
     * @param size size of operation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1025
     * @param shiftAmt arbitrary shift amount.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1026
     * @return value between 0 and size - 1 inclusive that is equivalent to shiftAmt according to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1027
     *         JLS.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1028
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1029
    private static int clampShiftAmt(int size, long shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1030
        return (int) (shiftAmt & (size - 1));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1031
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1032
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1033
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1034
     * dst = src1 & src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1035
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1036
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1037
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1038
     * @param src1 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1039
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1040
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1041
    public void and(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1042
        super.and(size, dst, src1, src2, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1043
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1044
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1045
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1046
     * dst = src1 ^ src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1047
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1048
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1049
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1050
     * @param src1 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1051
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1052
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1053
    public void eor(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1054
        super.eor(size, dst, src1, src2, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1055
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1056
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1057
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1058
     * dst = src1 | src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1059
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1060
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1061
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1062
     * @param src1 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1063
     * @param src2 general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1064
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1065
    public void or(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1066
        super.orr(size, dst, src1, src2, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1067
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1068
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1069
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1070
     * dst = src | bimm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1071
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1072
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1073
     * @param dst general purpose register. May not be null or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1074
     * @param src general purpose register. May not be null or stack-pointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1075
     * @param bimm logical immediate. See {@link AArch64Assembler.LogicalImmediateTable} for exact
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1076
     *            definition.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1077
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1078
    public void or(int size, Register dst, Register src, long bimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1079
        super.orr(size, dst, src, bimm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1080
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1081
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1082
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1083
     * dst = ~src.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1084
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1085
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1086
     * @param dst general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1087
     * @param src general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1088
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1089
    public void not(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1090
        super.orn(size, dst, zr, src, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1091
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1092
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1093
    /**
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1094
     * dst = src1 & shiftType(src2, imm).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1095
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1096
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1097
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1098
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1099
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1100
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1101
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1102
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1103
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1104
    public void and(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1105
        super.and(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1106
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1107
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1108
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1109
     * dst = src1 ^ shiftType(src2, imm).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1110
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1111
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1112
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1113
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1114
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1115
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1116
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1117
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1118
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1119
    public void eor(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1120
        super.eor(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1121
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1122
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1123
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1124
     * dst = src1 | shiftType(src2, imm).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1125
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1126
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1127
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1128
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1129
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1130
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1131
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1132
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1133
    public void or(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1134
        super.orr(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1135
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1136
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1137
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1138
     * dst = src1 & ~(shiftType(src2, imm)).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1139
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1140
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1141
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1142
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1143
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1144
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1145
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1146
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1147
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1148
    public void bic(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1149
        super.bic(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1150
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1151
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1152
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1153
     * dst = src1 ^ ~(shiftType(src2, imm)).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1154
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1155
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1156
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1157
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1158
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1159
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1160
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1161
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1162
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1163
    public void eon(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1164
        super.eon(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1165
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1166
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1167
    /**
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1168
     * dst = src1 | ~(shiftType(src2, imm)).
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1169
     *
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1170
     * @param size register size. Has to be 32 or 64.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1171
     * @param dst general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1172
     * @param src1 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1173
     * @param src2 general purpose register. May not be null or stackpointer.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1174
     * @param shiftType all types allowed, may not be null.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1175
     * @param shiftAmt must be in range 0 to size - 1.
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1176
     */
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1177
    @Override
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1178
    public void orn(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1179
        super.orn(size, dst, src1, src2, shiftType, shiftAmt);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1180
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1181
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
  1182
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1183
     * Sign-extend value from src into dst.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1184
     *
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1185
     * @param destSize destination register size. Must be 32 or 64.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1186
     * @param srcSize source register size. Must be smaller than destSize.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1187
     * @param dst general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1188
     * @param src general purpose register. May not be null, stackpointer or zero-register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1189
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1190
    public void sxt(int destSize, int srcSize, Register dst, Register src) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1191
        assert (srcSize < destSize && srcSize > 0);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1192
        super.sbfm(destSize, dst, src, 0, srcSize - 1);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1193
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1194
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1195
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1196
     * dst = src if condition else -src.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1197
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1198
     * @param size register size. Must be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1199
     * @param dst general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1200
     * @param src general purpose register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1201
     * @param condition any condition except AV or NV. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1202
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1203
    public void csneg(int size, Register dst, Register src, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1204
        super.csneg(size, dst, src, src, condition.negate());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1205
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1206
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1207
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1208
     * @return True if the immediate can be used directly for logical 64-bit instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1209
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1210
    public static boolean isLogicalImmediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1211
        return LogicalImmediateTable.isRepresentable(true, imm) != LogicalImmediateTable.Representable.NO;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1212
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1213
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1214
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1215
     * @return True if the immediate can be used directly for logical 32-bit instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1216
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1217
    public static boolean isLogicalImmediate(int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1218
        return LogicalImmediateTable.isRepresentable(imm) == LogicalImmediateTable.Representable.YES;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1219
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1220
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1221
    /* Float instructions */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1222
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1223
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1224
     * Moves integer to float, float to integer, or float to float. Does not support integer to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1225
     * integer moves.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1226
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1227
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1228
     * @param dst Either floating-point or general-purpose register. If general-purpose register may
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1229
     *            not be stackpointer or zero register. Cannot be null in any case.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1230
     * @param src Either floating-point or general-purpose register. If general-purpose register may
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1231
     *            not be stackpointer. Cannot be null in any case.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1232
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1233
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1234
    public void fmov(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1235
        assert !(dst.getRegisterCategory().equals(CPU) && src.getRegisterCategory().equals(CPU)) : "src and dst cannot both be integer registers.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1236
        if (dst.getRegisterCategory().equals(CPU)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1237
            super.fmovFpu2Cpu(size, dst, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1238
        } else if (src.getRegisterCategory().equals(CPU)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1239
            super.fmovCpu2Fpu(size, dst, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1240
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1241
            super.fmov(size, dst, src);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1242
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1243
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1244
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1245
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1246
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1247
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1248
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1249
     * @param imm immediate that is loaded into dst. If size is 32 only float immediates can be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1250
     *            loaded, i.e. (float) imm == imm must be true. In all cases
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1251
     *            {@code isFloatImmediate}, respectively {@code #isDoubleImmediate} must be true
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1252
     *            depending on size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1253
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1254
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1255
    public void fmov(int size, Register dst, double imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1256
        if (imm == 0.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1257
            assert Double.doubleToRawLongBits(imm) == 0L : "-0.0 is no valid immediate.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1258
            super.fmovCpu2Fpu(size, dst, zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1259
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1260
            super.fmov(size, dst, imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1261
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1262
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1263
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1264
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1265
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1266
     * @return true if immediate can be loaded directly into floating-point register, false
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1267
     *         otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1268
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1269
    public static boolean isDoubleImmediate(double imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1270
        return Double.doubleToRawLongBits(imm) == 0L || AArch64Assembler.isDoubleImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1271
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1272
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1273
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1274
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1275
     * @return true if immediate can be loaded directly into floating-point register, false
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1276
     *         otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1277
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1278
    public static boolean isFloatImmediate(float imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1279
        return Float.floatToRawIntBits(imm) == 0 || AArch64Assembler.isFloatImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1280
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1281
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1282
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1283
     * Conditional move. dst = src1 if condition else src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1284
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1285
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1286
     * @param result floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1287
     * @param trueValue floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1288
     * @param falseValue floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1289
     * @param condition every condition allowed. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1290
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1291
    public void fcmov(int size, Register result, Register trueValue, Register falseValue, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1292
        super.fcsel(size, result, trueValue, falseValue, condition);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1293
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1294
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1295
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1296
     * dst = src1 % src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1297
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1298
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1299
     * @param dst floating-point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1300
     * @param n numerator. Floating-point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1301
     * @param d denominator. Floating-point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1302
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1303
    public void frem(int size, Register dst, Register n, Register d) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1304
        // There is no frem instruction, instead we compute the remainder using the relation:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1305
        // rem = n - Truncating(n / d) * d
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1306
        super.fdiv(size, dst, n, d);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1307
        super.frintz(size, dst, dst);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1308
        super.fmsub(size, dst, dst, d, n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1309
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1310
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1311
    /**
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1312
     * dst = src1 * src2 + src3.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1313
     *
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1314
     * @param size register size.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1315
     * @param dst floating point register. May not be null.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1316
     * @param src1 floating point register. May not be null.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1317
     * @param src2 floating point register. May not be null.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1318
     * @param src3 floating point register. May not be null.
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1319
     */
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1320
    @Override
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1321
    public void fmadd(int size, Register dst, Register src1, Register src2, Register src3) {
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1322
        super.fmadd(size, dst, src1, src2, src3);
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1323
    }
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1324
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1325
    /* Branches */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1326
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1327
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1328
     * Compares x and y and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1329
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1330
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1331
     * @param x general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1332
     * @param y general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1333
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1334
    public void cmp(int size, Register x, Register y) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1335
        assert size == 32 || size == 64;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1336
        super.subs(size, zr, x, y, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1337
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1338
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1339
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1340
     * Compares x to y and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1341
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1342
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1343
     * @param x general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1344
     * @param y comparison immediate, {@link #isComparisonImmediate(long)} has to be true for it.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1345
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1346
    public void cmp(int size, Register x, int y) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1347
        assert size == 32 || size == 64;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1348
        if (y < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1349
            super.adds(size, zr, x, -y);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1350
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1351
            super.subs(size, zr, x, y);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1352
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1353
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1354
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1355
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1356
     * Sets condition flags according to result of x & y.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1357
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1358
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1359
     * @param dst general purpose register. May not be null or stack-pointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1360
     * @param x general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1361
     * @param y general purpose register. May not be null or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1362
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1363
    public void ands(int size, Register dst, Register x, Register y) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1364
        super.ands(size, dst, x, y, ShiftType.LSL, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1365
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1366
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1367
    /**
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1368
     * Sets overflow flag according to result of x * y.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1369
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1370
     * @param size register size. Has to be 32 or 64.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1371
     * @param dst general purpose register. May not be null or stack-pointer.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1372
     * @param x general purpose register. May not be null or stackpointer.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1373
     * @param y general purpose register. May not be null or stackpointer.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1374
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1375
    public void mulvs(int size, Register dst, Register x, Register y) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1376
        try (ScratchRegister sc1 = getScratchRegister();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1377
                        ScratchRegister sc2 = getScratchRegister()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1378
            switch (size) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1379
                case 64: {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1380
                    // Be careful with registers: it's possible that x, y, and dst are the same
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1381
                    // register.
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1382
                    Register temp1 = sc1.getRegister();
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1383
                    Register temp2 = sc2.getRegister();
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1384
                    mul(64, temp1, x, y);     // Result bits 0..63
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1385
                    smulh(64, temp2, x, y);  // Result bits 64..127
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1386
                    // Top is pure sign ext
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1387
                    subs(64, zr, temp2, temp1, ShiftType.ASR, 63);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1388
                    // Copy all 64 bits of the result into dst
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1389
                    mov(64, dst, temp1);
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1390
                    mov(temp1, 0x80000000);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1391
                    // Develop 0 (EQ), or 0x80000000 (NE)
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1392
                    cmov(32, temp1, temp1, zr, ConditionFlag.NE);
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1393
                    cmp(32, temp1, 1);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1394
                    // 0x80000000 - 1 => VS
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1395
                    break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1396
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1397
                case 32: {
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1398
                    Register temp1 = sc1.getRegister();
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1399
                    smaddl(temp1, x, y, zr);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1400
                    // Copy the low 32 bits of the result into dst
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1401
                    mov(32, dst, temp1);
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1402
                    subs(64, zr, temp1, temp1, ExtendType.SXTW, 0);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1403
                    // NE => overflow
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1404
                    mov(temp1, 0x80000000);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1405
                    // Develop 0 (EQ), or 0x80000000 (NE)
58533
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1406
                    cmov(32, temp1, temp1, zr, ConditionFlag.NE);
46b0b7fe255c 8231973: Update Graal
dlong
parents: 58299
diff changeset
  1407
                    cmp(32, temp1, 1);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1408
                    // 0x80000000 - 1 => VS
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1409
                    break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1410
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1411
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1412
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1413
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1414
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1415
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1416
     * When patching up Labels we have to know what kind of code to generate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1417
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1418
    public enum PatchLabelKind {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1419
        BRANCH_CONDITIONALLY(0x0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1420
        BRANCH_UNCONDITIONALLY(0x1),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1421
        BRANCH_NONZERO(0x2),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1422
        BRANCH_ZERO(0x3),
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1423
        BRANCH_BIT_NONZERO(0x4),
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1424
        BRANCH_BIT_ZERO(0x5),
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1425
        JUMP_ADDRESS(0x6),
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1426
        ADR(0x7);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1427
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1428
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1429
         * Offset by which additional information for branch conditionally, branch zero and branch
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1430
         * non zero has to be shifted.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1431
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1432
        public static final int INFORMATION_OFFSET = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1433
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1434
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1435
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1436
        PatchLabelKind(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1437
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1438
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1439
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1440
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1441
         * @return PatchLabelKind with given encoding.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1442
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1443
        private static PatchLabelKind fromEncoding(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1444
            return values()[encoding & NumUtil.getNbitNumberInt(INFORMATION_OFFSET)];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1445
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1446
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1447
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1448
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1449
    public void adr(Register dst, Label label) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1450
        // TODO Handle case where offset is too large for a single jump instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1451
        if (label.isBound()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1452
            int offset = label.position() - position();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1453
            super.adr(dst, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1454
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1455
            label.addPatchAt(position(), this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1456
            // Encode condition flag so that we know how to patch the instruction later
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1457
            emitInt(PatchLabelKind.ADR.encoding | dst.encoding << PatchLabelKind.INFORMATION_OFFSET);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1458
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1459
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1460
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1461
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1462
     * Compare register and branch if non-zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1463
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1464
     * @param size Instruction size in bits. Should be either 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1465
     * @param cmp general purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1466
     * @param label Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1467
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1468
    public void cbnz(int size, Register cmp, Label label) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1469
        // TODO Handle case where offset is too large for a single jump instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1470
        if (label.isBound()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1471
            int offset = label.position() - position();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1472
            super.cbnz(size, cmp, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1473
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1474
            label.addPatchAt(position(), this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1475
            int regEncoding = cmp.encoding << (PatchLabelKind.INFORMATION_OFFSET + 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1476
            int sizeEncoding = (size == 64 ? 1 : 0) << PatchLabelKind.INFORMATION_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1477
            // Encode condition flag so that we know how to patch the instruction later
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1478
            emitInt(PatchLabelKind.BRANCH_NONZERO.encoding | regEncoding | sizeEncoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1479
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1480
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1481
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1482
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1483
     * Compare register and branch if zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1484
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1485
     * @param size Instruction size in bits. Should be either 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1486
     * @param cmp general purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1487
     * @param label Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1488
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1489
    public void cbz(int size, Register cmp, Label label) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1490
        // TODO Handle case where offset is too large for a single jump instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1491
        if (label.isBound()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1492
            int offset = label.position() - position();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1493
            super.cbz(size, cmp, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1494
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1495
            label.addPatchAt(position(), this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1496
            int regEncoding = cmp.encoding << (PatchLabelKind.INFORMATION_OFFSET + 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1497
            int sizeEncoding = (size == 64 ? 1 : 0) << PatchLabelKind.INFORMATION_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1498
            // Encode condition flag so that we know how to patch the instruction later
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1499
            emitInt(PatchLabelKind.BRANCH_ZERO.encoding | regEncoding | sizeEncoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1500
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1501
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1502
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1503
    /**
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1504
     * Test a single bit and branch if the bit is nonzero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1505
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1506
     * @param cmp general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1507
     * @param uimm6 Unsigned 6-bit bit index.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1508
     * @param label Can only handle 16-bit word-aligned offsets for now. May be unbound. Non null.
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1509
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1510
    public void tbnz(Register cmp, int uimm6, Label label) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1511
        assert NumUtil.isUnsignedNbit(6, uimm6);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1512
        if (label.isBound()) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1513
            int offset = label.position() - position();
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1514
            super.tbnz(cmp, uimm6, offset);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1515
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1516
            label.addPatchAt(position(), this);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1517
            int indexEncoding = uimm6 << PatchLabelKind.INFORMATION_OFFSET;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1518
            int regEncoding = cmp.encoding << (PatchLabelKind.INFORMATION_OFFSET + 6);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1519
            emitInt(PatchLabelKind.BRANCH_BIT_NONZERO.encoding | indexEncoding | regEncoding);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1520
        }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1521
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1522
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1523
    /**
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1524
     * Test a single bit and branch if the bit is zero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1525
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1526
     * @param cmp general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1527
     * @param uimm6 Unsigned 6-bit bit index.
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1528
     * @param label Can only handle 16-bit word-aligned offsets for now. May be unbound. Non null.
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1529
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1530
    public void tbz(Register cmp, int uimm6, Label label) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1531
        assert NumUtil.isUnsignedNbit(6, uimm6);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1532
        if (label.isBound()) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1533
            int offset = label.position() - position();
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1534
            super.tbz(cmp, uimm6, offset);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1535
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1536
            label.addPatchAt(position(), this);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1537
            int indexEncoding = uimm6 << PatchLabelKind.INFORMATION_OFFSET;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1538
            int regEncoding = cmp.encoding << (PatchLabelKind.INFORMATION_OFFSET + 6);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1539
            emitInt(PatchLabelKind.BRANCH_BIT_ZERO.encoding | indexEncoding | regEncoding);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1540
        }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1541
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1542
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1543
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1544
     * Branches to label if condition is true.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1545
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1546
     * @param condition any condition value allowed. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1547
     * @param label Can only handle 21-bit word-aligned offsets for now. May be unbound. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1548
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1549
    public void branchConditionally(ConditionFlag condition, Label label) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1550
        // TODO Handle case where offset is too large for a single jump instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1551
        if (label.isBound()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1552
            int offset = label.position() - position();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1553
            super.b(condition, offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1554
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1555
            label.addPatchAt(position(), this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1556
            // Encode condition flag so that we know how to patch the instruction later
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1557
            emitInt(PatchLabelKind.BRANCH_CONDITIONALLY.encoding | condition.encoding << PatchLabelKind.INFORMATION_OFFSET);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1558
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1559
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1560
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1561
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1562
     * Branches if condition is true. Address of jump is patched up by HotSpot c++ code.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1563
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1564
     * @param condition any condition value allowed. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1565
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1566
    public void branchConditionally(ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1567
        // Correct offset is fixed up by HotSpot later.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1568
        super.b(condition, 0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1569
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1570
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1571
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1572
     * Jumps to label.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1573
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1574
     * param label Can only handle signed 28-bit offsets. May be unbound. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1575
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1576
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1577
    public void jmp(Label label) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1578
        // TODO Handle case where offset is too large for a single jump instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1579
        if (label.isBound()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1580
            int offset = label.position() - position();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1581
            super.b(offset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1582
        } else {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1583
            label.addPatchAt(position(), this);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1584
            emitInt(PatchLabelKind.BRANCH_UNCONDITIONALLY.encoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1585
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1586
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1587
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1588
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1589
     * Jump to address in dest.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1590
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1591
     * @param dest General purpose register. May not be null, zero-register or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1592
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1593
    public void jmp(Register dest) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1594
        super.br(dest);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1595
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1596
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1597
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1598
     * Immediate jump instruction fixed up by HotSpot c++ code.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1599
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1600
    public void jmp() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1601
        // Offset has to be fixed up by c++ code.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1602
        super.b(0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1603
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1604
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1605
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1606
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1607
     * @return true if immediate offset can be used in a single branch instruction.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1608
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1609
    public static boolean isBranchImmediateOffset(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1610
        return NumUtil.isSignedNbit(28, imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1611
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1612
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1613
    /* system instructions */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1614
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1615
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1616
     * Exception codes used when calling hlt instruction.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1617
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1618
    public enum AArch64ExceptionCode {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1619
        NO_SWITCH_TARGET(0x0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1620
        BREAKPOINT(0x1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1621
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1622
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1623
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1624
        AArch64ExceptionCode(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1625
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1626
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1627
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1628
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1629
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1630
     * Halting mode software breakpoint: Enters halting mode debug state if enabled, else treated as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1631
     * UNALLOCATED instruction.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1632
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1633
     * @param exceptionCode exception code specifying why halt was called. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1634
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1635
    public void hlt(AArch64ExceptionCode exceptionCode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1636
        super.hlt(exceptionCode.encoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1637
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1638
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1639
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1640
     * Monitor mode software breakpoint: exception routed to a debug monitor executing in a higher
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1641
     * exception level.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1642
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1643
     * @param exceptionCode exception code specifying why break was called. Non null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1644
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1645
    public void brk(AArch64ExceptionCode exceptionCode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1646
        super.brk(exceptionCode.encoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1647
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1648
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1649
    public void pause() {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1650
        super.hint(SystemHint.YIELD);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1651
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1652
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1653
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1654
     * Executes no-op instruction. No registers or flags are updated, except for PC.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1655
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1656
    public void nop() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1657
        super.hint(SystemHint.NOP);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1658
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1659
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1660
    /**
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1661
     * Consumption of Speculative Data Barrier. This is a memory barrier that controls speculative
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1662
     * execution and data value prediction.
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1663
     */
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1664
    public void csdb() {
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1665
        super.hint(SystemHint.CSDB);
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1666
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1667
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  1668
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1669
     * Same as {@link #nop()}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1670
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1671
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1672
    public void ensureUniquePC() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1673
        nop();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1674
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1675
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1676
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1677
     * Aligns PC.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1678
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1679
     * @param modulus Has to be positive multiple of 4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1680
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1681
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1682
    public void align(int modulus) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1683
        assert modulus > 0 && (modulus & 0x3) == 0 : "Modulus has to be a positive multiple of 4.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1684
        if (position() % modulus == 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1685
            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1686
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1687
        int offset = modulus - position() % modulus;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1688
        for (int i = 0; i < offset; i += 4) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1689
            nop();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1690
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1691
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1692
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1693
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1694
     * Patches jump targets when label gets bound.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1695
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1696
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1697
    protected void patchJumpTarget(int branch, int jumpTarget) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1698
        int instruction = getInt(branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1699
        int branchOffset = jumpTarget - branch;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1700
        PatchLabelKind type = PatchLabelKind.fromEncoding(instruction);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1701
        switch (type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1702
            case BRANCH_CONDITIONALLY:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1703
                ConditionFlag cf = ConditionFlag.fromEncoding(instruction >>> PatchLabelKind.INFORMATION_OFFSET);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1704
                super.b(cf, branchOffset, branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1705
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1706
            case BRANCH_UNCONDITIONALLY:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1707
                super.b(branchOffset, branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1708
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1709
            case JUMP_ADDRESS:
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1710
                int offset = instruction >>> PatchLabelKind.INFORMATION_OFFSET;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1711
                emitInt(jumpTarget - offset, branch);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1712
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1713
            case BRANCH_NONZERO:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1714
            case BRANCH_ZERO: {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1715
                int information = instruction >>> PatchLabelKind.INFORMATION_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1716
                int sizeEncoding = information & 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1717
                int regEncoding = information >>> 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1718
                Register reg = AArch64.cpuRegisters.get(regEncoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1719
                // 1 => 64; 0 => 32
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1720
                int size = sizeEncoding * 32 + 32;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1721
                if (!NumUtil.isSignedNbit(21, branchOffset)) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1722
                    throw new BranchTargetOutOfBoundsException(true, "Branch target %d out of bounds", branchOffset);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1723
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1724
                switch (type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1725
                    case BRANCH_NONZERO:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1726
                        super.cbnz(size, reg, branchOffset, branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1727
                        break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1728
                    case BRANCH_ZERO:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1729
                        super.cbz(size, reg, branchOffset, branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1730
                        break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1731
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1732
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1733
            }
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1734
            case BRANCH_BIT_NONZERO:
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1735
            case BRANCH_BIT_ZERO: {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1736
                int information = instruction >>> PatchLabelKind.INFORMATION_OFFSET;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1737
                int sizeEncoding = information & NumUtil.getNbitNumberInt(6);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1738
                int regEncoding = information >>> 6;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1739
                Register reg = AArch64.cpuRegisters.get(regEncoding);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1740
                if (!NumUtil.isSignedNbit(16, branchOffset)) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1741
                    throw new BranchTargetOutOfBoundsException(true, "Branch target %d out of bounds", branchOffset);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1742
                }
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1743
                switch (type) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1744
                    case BRANCH_BIT_NONZERO:
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1745
                        super.tbnz(reg, sizeEncoding, branchOffset, branch);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1746
                        break;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1747
                    case BRANCH_BIT_ZERO:
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1748
                        super.tbz(reg, sizeEncoding, branchOffset, branch);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1749
                        break;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1750
                }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1751
                break;
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1752
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1753
            case ADR: {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1754
                int information = instruction >>> PatchLabelKind.INFORMATION_OFFSET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1755
                int regEncoding = information;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1756
                Register reg = AArch64.cpuRegisters.get(regEncoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1757
                super.adr(reg, branchOffset, branch);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1758
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1759
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1760
            default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1761
                throw GraalError.shouldNotReachHere();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1762
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1763
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1764
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1765
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1766
     * Generates an address of the form {@code base + displacement}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1767
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1768
     * Does not change base register to fulfill this requirement. Will fail if displacement cannot
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1769
     * be represented directly as address.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1770
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1771
     * @param base general purpose register. May not be null or the zero register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1772
     * @param displacement arbitrary displacement added to base.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1773
     * @return AArch64Address referencing memory at {@code base + displacement}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1774
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1775
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1776
    public AArch64Address makeAddress(Register base, int displacement) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1777
        return makeAddress(base, displacement, zr, /* signExtend */false, /* transferSize */0, //
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1778
                        zr, /* allowOverwrite */false);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1779
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1780
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1781
    @Override
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1782
    public AArch64Address getPlaceholder(int instructionStartPosition) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1783
        return AArch64Address.PLACEHOLDER;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1784
    }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1785
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 47216
diff changeset
  1786
    public void addressOf(Register dst) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1787
        if (codePatchingAnnotationConsumer != null) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1788
            codePatchingAnnotationConsumer.accept(new AdrpAddMacroInstruction(position()));
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1789
        }
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 47216
diff changeset
  1790
        super.adrp(dst);
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 47216
diff changeset
  1791
        super.add(64, dst, dst, 0);
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 47216
diff changeset
  1792
    }
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 47216
diff changeset
  1793
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1794
    /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1795
     * Loads an address into Register d.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1796
     *
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1797
     * @param d general purpose register. May not be null.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1798
     * @param a AArch64Address the address of an operand.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1799
     */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1800
    public void lea(Register d, AArch64Address a) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1801
        a.lea(this, d);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1802
    }
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1803
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1804
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1805
     * Count the set bits of src register.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1806
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1807
     * @param size src register size. Has to be 32 or 64.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1808
     * @param dst general purpose register. Should not be null or zero-register.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1809
     * @param src general purpose register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1810
     * @param vreg SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1811
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1812
    public void popcnt(int size, Register dst, Register src, Register vreg) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1813
        assert 32 == size || 64 == size : "Invalid data size";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1814
        fmov(size, vreg, src);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1815
        final int fixedSize = 64;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1816
        cnt(fixedSize, vreg, vreg);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1817
        addv(fixedSize, SIMDElementSize.Byte, vreg, vreg);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1818
        umov(fixedSize, dst, 0, vreg);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1819
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  1820
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1821
    public interface MacroInstruction {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1822
        void patch(int codePos, int relative, byte[] code);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1823
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1824
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1825
    /**
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1826
     * Emits elf patchable adrp ldr sequence.
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1827
     */
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1828
    public void adrpLdr(int srcSize, Register result, AArch64Address a) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1829
        if (codePatchingAnnotationConsumer != null) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1830
            codePatchingAnnotationConsumer.accept(new AdrpLdrMacroInstruction(position()));
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1831
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1832
        super.adrp(a.getBase());
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1833
        this.ldr(srcSize, result, a);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1834
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1835
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1836
    public static class AdrpLdrMacroInstruction extends CodeAnnotation implements MacroInstruction {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1837
        public AdrpLdrMacroInstruction(int position) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1838
            super(position);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1839
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1840
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1841
        @Override
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1842
        public String toString() {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1843
            return "ADRP_LDR";
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1844
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1845
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1846
        @Override
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1847
        public void patch(int codePos, int relative, byte[] code) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1848
            throw GraalError.unimplemented();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1849
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1850
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1851
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1852
    public static class AdrpAddMacroInstruction extends CodeAnnotation implements MacroInstruction {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1853
        public AdrpAddMacroInstruction(int position) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1854
            super(position);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1855
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1856
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1857
        @Override
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1858
        public String toString() {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1859
            return "ADRP_ADD";
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1860
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1861
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1862
        @Override
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1863
        public void patch(int codePos, int relative, byte[] code) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1864
            throw GraalError.unimplemented();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1865
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1866
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1867
}