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