src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.asm.aarch64/src/org/graalvm/compiler/asm/aarch64/AArch64Assembler.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58299 6df94ce3ab2f
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
     2
 * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 49873
diff changeset
     3
 * Copyright (c) 2018, Red Hat Inc. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 * 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
     5
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * 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
     7
 * 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
     8
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * 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
    11
 * 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
    12
 * 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
    13
 * 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
    14
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 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
    17
 * 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
    18
 * 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
    19
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * 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
    21
 * 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
    22
 * questions.
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
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    28
import static jdk.vm.ci.aarch64.AArch64.CPU;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    29
import static jdk.vm.ci.aarch64.AArch64.SIMD;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    30
import static jdk.vm.ci.aarch64.AArch64.cpuRegisters;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    31
import static jdk.vm.ci.aarch64.AArch64.r0;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    32
import static jdk.vm.ci.aarch64.AArch64.sp;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    33
import static jdk.vm.ci.aarch64.AArch64.zr;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ADD;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ADDS;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    36
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ADDV;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ADR;
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 49873
diff changeset
    38
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ADRP;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.AND;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ANDS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ASRV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BFM;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BIC;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BICS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BLR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.BRK;
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
    48
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CAS;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
    49
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CCMP;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CLREX;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CLS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CLZ;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
    53
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CNT;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CSEL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CSINC;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.CSNEG;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
    57
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.DC;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.DMB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.EON;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.EOR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.EXTR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FABS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FADD;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCCMP;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCMP;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCMPZERO;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCSEL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCVTDS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCVTSD;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FCVTZS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FDIV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FMADD;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FMOV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FMSUB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FMUL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FNEG;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
    77
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FRINTM;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
    78
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FRINTN;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
    79
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FRINTP;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FRINTZ;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FSQRT;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.FSUB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.HINT;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.HLT;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
    85
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDADD;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDAR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDAXR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDP;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDRS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LDXR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LSLV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.LSRV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MADD;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MOVK;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MOVN;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MOVZ;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
    98
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MRS;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.MSUB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ORN;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.ORR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.RBIT;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.RET;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.REVW;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.REVX;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.RORV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SBFM;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SCVTF;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SDIV;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.STLR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.STLXR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.STP;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.STR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.STXR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SUB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SUBS;
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   117
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.SWP;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   118
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.TBNZ;
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   119
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.TBZ;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.UBFM;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.UDIV;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   122
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.Instruction.UMOV;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.FP32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.FP64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.General32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.General64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.floatFromSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.generalFromSize;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   129
import static org.graalvm.compiler.asm.aarch64.AArch64Assembler.InstructionType.simdFromSize;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
import java.util.Arrays;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
import org.graalvm.compiler.asm.Assembler;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   134
import org.graalvm.compiler.asm.aarch64.AArch64Address.AddressingMode;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   135
import org.graalvm.compiler.core.common.NumUtil;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
import org.graalvm.compiler.debug.GraalError;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   138
import jdk.vm.ci.aarch64.AArch64;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   139
import jdk.vm.ci.aarch64.AArch64.CPUFeature;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   140
import jdk.vm.ci.aarch64.AArch64.Flag;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
import jdk.vm.ci.code.Register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
import jdk.vm.ci.code.TargetDescription;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
public abstract class AArch64Assembler extends Assembler {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
    public static class LogicalImmediateTable {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
        private static final Immediate[] IMMEDIATE_TABLE = buildImmediateTable();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
        private static final int ImmediateOffset = 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   151
        private static final int ImmediateRotateOffset = 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   152
        private static final int ImmediateSizeOffset = 22;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   153
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
         * Specifies whether immediate can be represented in all cases (YES), as a 64bit instruction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
         * (SIXTY_FOUR_BIT_ONLY) or not at all (NO).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
        enum Representable {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
            YES,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
            SIXTY_FOUR_BIT_ONLY,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
            NO
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
         * Tests whether an immediate can be encoded for logical instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
         *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
         * @param is64bit if true immediate is considered a 64-bit pattern. If false we may use a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
         *            64-bit instruction to load the 32-bit pattern into a register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
         * @return enum specifying whether immediate can be used for 32- and 64-bit logical
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
         *         instructions ({@code #Representable.YES}), for 64-bit instructions only (
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
         *         {@link Representable#SIXTY_FOUR_BIT_ONLY}) or not at all (
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
         *         {@link Representable#NO}).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
        public static Representable isRepresentable(boolean is64bit, long immediate) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
            int pos = getLogicalImmTablePos(is64bit, immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
            if (pos < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
                // if 32bit instruction we can try again as 64bit immediate which may succeed.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
                // i.e. 0xffffffff fails as a 32bit immediate but works as 64bit one.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
                if (!is64bit) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
                    assert NumUtil.isUnsignedNbit(32, immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
                    pos = getLogicalImmTablePos(true, immediate);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
                    return pos >= 0 ? Representable.SIXTY_FOUR_BIT_ONLY : Representable.NO;
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
                return Representable.NO;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   186
            Immediate imm = IMMEDIATE_TABLE[pos];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
            return imm.only64bit() ? Representable.SIXTY_FOUR_BIT_ONLY : Representable.YES;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   188
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   189
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   190
        public static Representable isRepresentable(int immediate) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
            return isRepresentable(false, immediate & 0xFFFF_FFFFL);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
        public static int getLogicalImmEncoding(boolean is64bit, long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   195
            int pos = getLogicalImmTablePos(is64bit, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
            assert pos >= 0 : "Value cannot be represented as logical immediate: " + value + ", is64bit=" + is64bit;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   197
            Immediate imm = IMMEDIATE_TABLE[pos];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
            assert is64bit || !imm.only64bit() : "Immediate can only be represented for 64bit, but 32bit instruction specified";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
            return IMMEDIATE_TABLE[pos].encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   200
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   201
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   203
         * @param is64bit if true also allow 64-bit only encodings to be returned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   204
         * @return If positive the return value is the position into the IMMEDIATE_TABLE for the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
         *         given immediate, if negative the immediate cannot be encoded.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   207
        private static int getLogicalImmTablePos(boolean is64bit, long value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   208
            Immediate imm;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   209
            if (!is64bit) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   210
                // 32bit instructions can only have 32bit immediates.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   211
                if (!NumUtil.isUnsignedNbit(32, value)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   212
                    return -1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   214
                // If we have a 32bit instruction (and therefore immediate) we have to duplicate it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   215
                // across 64bit to find it in the table.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   216
                imm = new Immediate(value << 32 | value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   217
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   218
                imm = new Immediate(value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   219
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   220
            int pos = Arrays.binarySearch(IMMEDIATE_TABLE, imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   221
            if (pos < 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   222
                return -1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   223
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   224
            if (!is64bit && IMMEDIATE_TABLE[pos].only64bit()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   225
                return -1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   226
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   227
            return pos;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   230
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
         * To quote 5.4.2: [..] an immediate is a 32 or 64 bit pattern viewed as a vector of
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
         * identical elements of size e = 2, 4, 8, 16, 32 or (in the case of bimm64) 64 bits. Each
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   233
         * element contains the same sub-pattern: a single run of 1 to e-1 non-zero bits, rotated by
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   234
         * 0 to e-1 bits. It is encoded in the following: 10-16: rotation amount (6bit) starting
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   235
         * from 1s in the LSB (i.e. 0111->1011->1101->1110) 16-22: This stores a combination of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   236
         * number of set bits and the pattern size. The pattern size is encoded as follows (x is
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   237
         * used to store the number of 1 bits - 1) e pattern 2 1111xx 4 1110xx 8 110xxx 16 10xxxx 32
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   238
         * 0xxxxx 64 xxxxxx 22: if set we have an instruction with 64bit pattern?
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
        private static final class Immediate implements Comparable<Immediate> {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
            public final long imm;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   242
            public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   244
            Immediate(long imm, boolean is64, int s, int r) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   245
                this.imm = imm;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
                this.encoding = computeEncoding(is64, s, r);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   247
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
            // Used to be able to binary search for an immediate in the table.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   250
            Immediate(long imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
                this(imm, false, 0, 0);
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
            /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   255
             * Returns true if this pattern is only representable as 64bit.
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
            public boolean only64bit() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
                return (encoding & (1 << ImmediateSizeOffset)) != 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
            private static int computeEncoding(boolean is64, int s, int r) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
                int sf = is64 ? 1 : 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
                return sf << ImmediateSizeOffset | r << ImmediateRotateOffset | s << ImmediateOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   264
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
            @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
            public int compareTo(Immediate o) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
                return Long.compare(imm, o.imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   271
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   272
        private static Immediate[] buildImmediateTable() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
            final int nrImmediates = 5334;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
            final Immediate[] table = new Immediate[nrImmediates];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
            int nrImms = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
            for (int logE = 1; logE <= 6; logE++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   277
                int e = 1 << logE;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   278
                long mask = NumUtil.getNbitNumberLong(e);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   279
                for (int nrOnes = 1; nrOnes < e; nrOnes++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   280
                    long val = (1L << nrOnes) - 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
                    // r specifies how much we rotate the value
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
                    for (int r = 0; r < e; r++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
                        long immediate = (val >>> r | val << (e - r)) & mask;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
                        // Duplicate pattern to fill whole 64bit range.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
                        switch (logE) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
                            case 1:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
                                immediate |= immediate << 2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
                                immediate |= immediate << 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
                                immediate |= immediate << 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
                                immediate |= immediate << 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
                                immediate |= immediate << 32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
                                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
                            case 2:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
                                immediate |= immediate << 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
                                immediate |= immediate << 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
                                immediate |= immediate << 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
                                immediate |= immediate << 32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
                                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
                            case 3:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   300
                                immediate |= immediate << 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   301
                                immediate |= immediate << 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   302
                                immediate |= immediate << 32;
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 4:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
                                immediate |= immediate << 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
                                immediate |= immediate << 32;
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 5:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   309
                                immediate |= immediate << 32;
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
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   312
                        // 5 - logE can underflow to -1, but we shift this bogus result
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   313
                        // out of the masked area.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
                        int sizeEncoding = (1 << (5 - logE)) - 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   315
                        int s = ((sizeEncoding << (logE + 1)) & 0x3f) | (nrOnes - 1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
                        table[nrImms++] = new Immediate(immediate, /* is64bit */e == 64, s, r);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   317
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   318
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   319
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   320
            Arrays.sort(table);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   321
            assert nrImms == nrImmediates : nrImms + " instead of " + nrImmediates + " in table.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   322
            assert checkDuplicates(table) : "Duplicate values in table.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
            return table;
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
        private static boolean checkDuplicates(Immediate[] table) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
            for (int i = 0; i < table.length - 1; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
                if (table[i].imm >= table[i + 1].imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
                    return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   335
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   336
    private static final int RdOffset = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   337
    private static final int Rs1Offset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
    private static final int Rs2Offset = 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
    private static final int Rs3Offset = 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   340
    private static final int RtOffset = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   341
    private static final int RnOffset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
    private static final int Rt2Offset = 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   343
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   344
    /* Helper functions */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   345
    private static int rd(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   346
        return reg.encoding << RdOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   347
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   348
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   349
    private static int rs1(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   350
        return reg.encoding << Rs1Offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   351
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   352
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   353
    private static int rs2(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
        return reg.encoding << Rs2Offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   355
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   356
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   357
    private static int rs3(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   358
        return reg.encoding << Rs3Offset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   359
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   360
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   361
    private static int rt(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   362
        return reg.encoding << RtOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   363
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   364
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   365
    private static int rt2(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   366
        return reg.encoding << Rt2Offset;
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
    private static int rn(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   370
        return reg.encoding << RnOffset;
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
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   373
    private static int maskField(int sizeInBits, int n) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   374
        assert NumUtil.isSignedNbit(sizeInBits, n);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   375
        return n & NumUtil.getNbitNumberInt(sizeInBits);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   376
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   377
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   378
    /**
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   379
     * Enumeration of all different lane types of SIMD register.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   380
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   381
     * Byte(B):8b/lane; HalfWord(H):16b/lane; Word(S):32b/lane; DoubleWord(D):64b/lane.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   382
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   383
    public enum SIMDElementSize {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   384
        Byte(0, 8),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   385
        HalfWord(1, 16),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   386
        Word(2, 32),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   387
        DoubleWord(3, 64);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   388
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   389
        public final int encoding;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   390
        public final int nbits;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   391
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   392
        SIMDElementSize(int encoding, int nbits) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   393
            this.encoding = encoding;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   394
            this.nbits = nbits;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   395
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   396
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   397
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   398
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   399
     * Enumeration of all different instruction kinds: General32/64 are the general instructions
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   400
     * (integer, branch, etc.), for 32-, respectively 64-bit operands. FP32/64 is the encoding for
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   401
     * the 32/64bit float operations. SIMDByte/HalfWord/Word/DoubleWord is the encoding for SIMD
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   402
     * instructions
43972
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
    protected enum InstructionType {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   405
        General32(0b00 << 30, 32, true),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   406
        General64(0b10 << 30, 64, true),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   407
        FP32(0x00000000, 32, false),
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   408
        FP64(0x00400000, 64, false),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   409
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   410
        SIMDByte(0x01, 8, false),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   411
        SIMDHalfWord(0x02, 16, false),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   412
        SIMDWord(0x04, 32, false),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   413
        SIMDDoubleWord(0x08, 64, false);
43972
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
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   416
        public final int width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   417
        public final boolean isGeneral;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   418
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   419
        InstructionType(int encoding, int width, boolean isGeneral) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   420
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   421
            this.width = width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   422
            this.isGeneral = isGeneral;
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   425
        public static InstructionType generalFromSize(int size) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   426
            assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   427
            return size == 32 ? General32 : General64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   428
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   429
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   430
        public static InstructionType floatFromSize(int size) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   431
            assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   432
            return size == 32 ? FP32 : FP64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   433
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   434
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   435
        public static InstructionType simdFromSize(int size) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   436
            switch (size) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   437
                case 8:
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   438
                    return SIMDByte;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   439
                case 16:
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   440
                    return SIMDHalfWord;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   441
                case 32:
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   442
                    return SIMDWord;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   443
                case 64:
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   444
                    return SIMDDoubleWord;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   445
                default:
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   446
                    throw GraalError.shouldNotReachHere();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   447
            }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   448
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   449
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   450
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   451
    private static final int ImmediateOffset = 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   452
    private static final int ImmediateRotateOffset = 16;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   453
    private static final int ImmediateSizeOffset = 22;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   454
    private static final int ExtendTypeOffset = 13;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   455
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   456
    private static final int AddSubImmOp = 0x11000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
    private static final int AddSubShift12 = 0b01 << 22;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   458
    private static final int AddSubSetFlag = 0x20000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   459
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   460
    private static final int LogicalImmOp = 0x12000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   461
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   462
    private static final int MoveWideImmOp = 0x12800000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   463
    private static final int MoveWideImmOffset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   464
    private static final int MoveWideShiftOffset = 21;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   465
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   466
    private static final int BitfieldImmOp = 0x13000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   467
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   468
    private static final int AddSubShiftedOp = 0x0B000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   469
    private static final int ShiftTypeOffset = 22;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   470
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   471
    private static final int AddSubExtendedOp = 0x0B200000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   472
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   473
    private static final int MulOp = 0x1B000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   474
    private static final int DataProcessing1SourceOp = 0x5AC00000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   475
    private static final int DataProcessing2SourceOp = 0x1AC00000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   476
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   477
    private static final int Fp1SourceOp = 0x1E204000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   478
    private static final int Fp2SourceOp = 0x1E200800;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   479
    private static final int Fp3SourceOp = 0x1F000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   480
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   481
    private static final int FpConvertOp = 0x1E200000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   482
    private static final int FpImmOp = 0x1E201000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   483
    private static final int FpImmOffset = 13;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   484
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   485
    private static final int FpCmpOp = 0x1E202000;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   486
    private static final int FpCmpeOp = 0x1E202010;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   487
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   488
    private static final int PcRelImmHiOffset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   489
    private static final int PcRelImmLoOffset = 29;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   490
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   491
    private static final int PcRelImmOp = 0x10000000;
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
    private static final int UnconditionalBranchImmOp = 0x14000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   494
    private static final int UnconditionalBranchRegOp = 0xD6000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   495
    private static final int CompareBranchOp = 0x34000000;
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
    private static final int ConditionalBranchImmOffset = 5;
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
    private static final int ConditionalSelectOp = 0x1A800000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   500
    private static final int ConditionalConditionOffset = 12;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   501
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   502
    private static final int LoadStoreScaledOp = 0b111_0_01_00 << 22;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   503
    private static final int LoadStoreUnscaledOp = 0b111_0_00_00 << 22;
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
    private static final int LoadStoreRegisterOp = 0b111_0_00_00_1 << 21 | 0b10 << 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   506
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   507
    private static final int LoadLiteralOp = 0x18000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   508
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   509
    private static final int LoadStorePostIndexedOp = 0b111_0_00_00_0 << 21 | 0b01 << 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   510
    private static final int LoadStorePreIndexedOp = 0b111_0_00_00_0 << 21 | 0b11 << 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   511
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   512
    private static final int LoadStoreUnscaledImmOffset = 12;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   513
    private static final int LoadStoreScaledImmOffset = 10;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   514
    private static final int LoadStoreScaledRegOffset = 12;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   515
    private static final int LoadStoreIndexedImmOffset = 12;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   516
    private static final int LoadStoreTransferSizeOffset = 30;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   517
    private static final int LoadStoreFpFlagOffset = 26;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   518
    private static final int LoadLiteralImmeOffset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   519
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   520
    private static final int LoadStorePairOp = 0b101_0 << 26;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   521
    @SuppressWarnings("unused") private static final int LoadStorePairPostIndexOp = 0b101_0_001 << 23;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   522
    @SuppressWarnings("unused") private static final int LoadStorePairPreIndexOp = 0b101_0_011 << 23;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   523
    private static final int LoadStorePairImm7Offset = 15;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   524
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   525
    private static final int LogicalShiftOp = 0x0A000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   526
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   527
    private static final int ExceptionOp = 0xD4000000;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   528
    private static final int SystemImmediateOffset = 5;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   529
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   530
    @SuppressWarnings("unused") private static final int SimdImmediateOffset = 16;
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
    private static final int BarrierOp = 0xD503301F;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   533
    private static final int BarrierKindOffset = 8;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   534
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   535
    private static final int CASAcquireOffset = 22;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   536
    private static final int CASReleaseOffset = 15;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   537
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   538
    private static final int LDADDAcquireOffset = 23;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   539
    private static final int LDADDReleaseOffset = 22;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   540
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   541
    private static final int SIMDImm5Offset = 16;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   542
    private static final int SIMDQBitOffset = 30;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   543
    private static final int SIMDSizeOffset = 22;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   544
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   545
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   546
     * Encoding for all instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   547
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   548
    public enum Instruction {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   549
        BCOND(0x54000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   550
        CBNZ(0x01000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   551
        CBZ(0x00000000),
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   552
        TBZ(0x36000000),
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   553
        TBNZ(0x37000000),
43972
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
        B(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   556
        BL(0x80000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   557
        BR(0x001F0000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   558
        BLR(0x003F0000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   559
        RET(0x005F0000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   560
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   561
        LDR(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   562
        LDRS(0x00800000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   563
        LDXR(0x081f7c00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   564
        LDAR(0x8dffc00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   565
        LDAXR(0x85ffc00),
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
        STR(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   568
        STXR(0x08007c00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   569
        STLR(0x089ffc00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   570
        STLXR(0x0800fc00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   571
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
        LDP(0b1 << 22),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
        STP(0b0 << 22),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   574
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   575
        CAS(0x08A07C00),
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   576
        LDADD(0x38200000),
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
   577
        SWP(0x38208000),
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   578
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   579
        ADR(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   580
        ADRP(0x80000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   581
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   582
        ADD(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   583
        ADDS(ADD.encoding | AddSubSetFlag),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   584
        SUB(0x40000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   585
        SUBS(SUB.encoding | AddSubSetFlag),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   586
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   587
        CCMP(0x7A400000),
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   588
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   589
        NOT(0x00200000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   590
        AND(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   591
        BIC(AND.encoding | NOT.encoding),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   592
        ORR(0x20000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   593
        ORN(ORR.encoding | NOT.encoding),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   594
        EOR(0x40000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   595
        EON(EOR.encoding | NOT.encoding),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   596
        ANDS(0x60000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   597
        BICS(ANDS.encoding | NOT.encoding),
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
        ASRV(0x00002800),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   600
        RORV(0x00002C00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   601
        LSRV(0x00002400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   602
        LSLV(0x00002000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   603
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   604
        CLS(0x00001400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   605
        CLZ(0x00001000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   606
        RBIT(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   607
        REVX(0x00000C00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   608
        REVW(0x00000800),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   609
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   610
        MOVN(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   611
        MOVZ(0x40000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   612
        MOVK(0x60000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   613
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   614
        CSEL(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   615
        CSNEG(0x40000400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   616
        CSINC(0x00000400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   617
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   618
        BFM(0x20000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   619
        SBFM(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   620
        UBFM(0x40000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   621
        EXTR(0x13800000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   622
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   623
        MADD(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   624
        MSUB(0x00008000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   625
        SDIV(0x00000C00),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   626
        UDIV(0x00000800),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   627
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   628
        FMOV(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   629
        FMOVCPU2FPU(0x00070000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   630
        FMOVFPU2CPU(0x00060000),
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
        FCVTDS(0x00028000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   633
        FCVTSD(0x00020000),
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
        FCVTZS(0x00180000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   636
        SCVTF(0x00020000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   637
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   638
        FABS(0x00008000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   639
        FSQRT(0x00018000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   640
        FNEG(0x00010000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   641
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   642
        FRINTM(0x00050000),
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   643
        FRINTN(0x00040000),
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
   644
        FRINTP(0x00048000),
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   645
        FRINTZ(0x00058000),
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
        FADD(0x00002000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   648
        FSUB(0x00003000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   649
        FMUL(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   650
        FDIV(0x00001000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   651
        FMAX(0x00004000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   652
        FMIN(0x00005000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   653
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   654
        FMADD(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   655
        FMSUB(0x00008000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   656
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   657
        FCMP(0x00000000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   658
        FCMPZERO(0x00000008),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   659
        FCCMP(0x1E200400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   660
        FCSEL(0x1E200C00),
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
        INS(0x4e081c00),
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   663
        UMOV(0x0e003c00),
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   664
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   665
        CNT(0xe205800),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   666
        USRA(0x6f001400),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   667
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   668
        HLT(0x00400000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   669
        BRK(0x00200000),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   670
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   671
        CLREX(0xd5033f5f),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   672
        HINT(0xD503201F),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   673
        DMB(0x000000A0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   674
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   675
        MRS(0xD5300000),
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   676
        MSR(0xD5100000),
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   677
        DC(0xD5087000),
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   678
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   679
        BLR_NATIVE(0xc0000000),
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   680
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
   681
        ADDV(0x0e31b800);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   682
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   683
        public final int encoding;
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
        Instruction(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   686
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   687
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   688
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   689
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   690
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   691
    public enum SystemRegister {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   692
        FPCR(0b11, 0b011, 0b0100, 0b0100, 0b000),
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   693
        FPSR(0b11, 0b011, 0b0100, 0b0100, 0b001);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   694
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   695
        SystemRegister(int op0, int op1, int crn, int crm, int op2) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   696
            this.op0 = op0;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   697
            this.op1 = op1;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   698
            this.crn = crn;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   699
            this.crm = crm;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   700
            this.op2 = op2;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   701
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   702
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   703
        public int encoding() {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   704
            return op0 << 19 | op1 << 16 | crn << 12 | crm << 8 | op2 << 5;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   705
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   706
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   707
        private final int op0;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   708
        private final int op1;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   709
        private final int crn;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   710
        private final int crm;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   711
        private final int op2;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   712
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
   713
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   714
    public enum DataCacheOperationType {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   715
        ZVA(0b011, 0b0100, 0b001);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   716
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   717
        DataCacheOperationType(int op1, int crm, int op2) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   718
            this.op1 = op1;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   719
            this.crm = crm;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   720
            this.op2 = op2;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   721
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   722
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   723
        public int encoding() {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   724
            return op1 << 16 | crm << 8 | op2 << 5;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   725
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   726
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   727
        private final int op1;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   728
        private final int crm;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   729
        private final int op2;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   730
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
   731
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   732
    public enum ShiftType {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   733
        LSL(0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   734
        LSR(1),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   735
        ASR(2),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   736
        ROR(3);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   737
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   738
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   739
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   740
        ShiftType(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   741
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   742
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   743
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   744
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   745
    public enum ExtendType {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   746
        UXTB(0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   747
        UXTH(1),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   748
        UXTW(2),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   749
        UXTX(3),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   750
        SXTB(4),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   751
        SXTH(5),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   752
        SXTW(6),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   753
        SXTX(7);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   754
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   755
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   756
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   757
        ExtendType(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   758
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   759
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   760
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   761
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   762
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   763
     * Condition Flags for branches. See 4.3
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   764
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   765
    public enum ConditionFlag {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   766
        // Integer | Floating-point meanings
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   767
        /** Equal | Equal. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   768
        EQ(0x0),
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
        /** Not Equal | Not equal or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   771
        NE(0x1),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   772
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   773
        /** Unsigned Higher or Same | Greater than, equal or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   774
        HS(0x2),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   775
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   776
        /** Unsigned lower | less than. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   777
        LO(0x3),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   778
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   779
        /** Minus (negative) | less than. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   780
        MI(0x4),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   781
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   782
        /** Plus (positive or zero) | greater than, equal or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   783
        PL(0x5),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   784
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   785
        /** Overflow set | unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   786
        VS(0x6),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   787
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   788
        /** Overflow clear | ordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   789
        VC(0x7),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   790
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   791
        /** Unsigned higher | greater than or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   792
        HI(0x8),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   793
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   794
        /** Unsigned lower or same | less than or equal. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   795
        LS(0x9),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   796
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   797
        /** Signed greater than or equal | greater than or equal. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   798
        GE(0xA),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   799
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   800
        /** Signed less than | less than or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   801
        LT(0xB),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   802
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   803
        /** Signed greater than | greater than. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   804
        GT(0xC),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   805
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   806
        /** Signed less than or equal | less than, equal or unordered. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   807
        LE(0xD),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   808
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   809
        /** Always | always. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   810
        AL(0xE),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   811
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   812
        /** Always | always (identical to AL, just to have valid 0b1111 encoding). */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   813
        NV(0xF);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   814
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   815
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   816
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   817
        ConditionFlag(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   818
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   819
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   820
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   821
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   822
         * @return ConditionFlag specified by decoding.
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
        public static ConditionFlag fromEncoding(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   825
            return values()[encoding];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   826
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   827
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   828
        public ConditionFlag negate() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   829
            switch (this) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   830
                case EQ:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   831
                    return NE;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   832
                case NE:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   833
                    return EQ;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   834
                case HS:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   835
                    return LO;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   836
                case LO:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   837
                    return HS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   838
                case MI:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   839
                    return PL;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   840
                case PL:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   841
                    return MI;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   842
                case VS:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   843
                    return VC;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   844
                case VC:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   845
                    return VS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   846
                case HI:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   847
                    return LS;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   848
                case LS:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   849
                    return HI;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   850
                case GE:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   851
                    return LT;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   852
                case LT:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   853
                    return GE;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   854
                case GT:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   855
                    return LE;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   856
                case LE:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   857
                    return GT;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   858
                case AL:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   859
                case NV:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   860
                default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   861
                    throw GraalError.shouldNotReachHere();
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
    }
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
    public AArch64Assembler(TargetDescription target) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   867
        super(target);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   868
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   869
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   870
    public boolean supports(CPUFeature feature) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   871
        return ((AArch64) target.arch).getFeatures().contains(feature);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   872
    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   874
    public boolean isFlagSet(Flag flag) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   875
        return ((AArch64) target.arch).getFlags().contains(flag);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   876
    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
   877
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   878
    /* Conditional Branch (5.2.1) */
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
     * Branch conditionally.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   882
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   883
     * @param condition may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   884
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   885
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   886
    protected void b(ConditionFlag condition, int imm21) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   887
        b(condition, imm21, -1);
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   890
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   891
     * Branch conditionally. Inserts instruction into code buffer at pos.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   892
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   893
     * @param condition may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   894
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   895
     * @param pos Position at which instruction is inserted into buffer. -1 means insert at end.
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
    protected void b(ConditionFlag condition, int imm21, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   898
        if (pos == -1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   899
            emitInt(Instruction.BCOND.encoding | getConditionalBranchImm(imm21) | condition.encoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   900
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   901
            emitInt(Instruction.BCOND.encoding | getConditionalBranchImm(imm21) | condition.encoding, pos);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   902
        }
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   905
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   906
     * Compare register and branch if non-zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   907
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   908
     * @param reg 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
   909
     * @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
   910
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   911
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   912
    protected void cbnz(int size, Register reg, int imm21) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   913
        conditionalBranchInstruction(reg, imm21, generalFromSize(size), Instruction.CBNZ, -1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   914
    }
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   917
     * Compare register and branch if non-zero.
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
     * @param reg 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
   920
     * @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
   921
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   922
     * @param pos Position at which instruction is inserted into buffer. -1 means insert at end.
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
    protected void cbnz(int size, Register reg, int imm21, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   925
        conditionalBranchInstruction(reg, imm21, generalFromSize(size), Instruction.CBNZ, pos);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   926
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   927
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   928
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   929
     * Compare and branch if zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   930
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   931
     * @param reg 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
   932
     * @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
   933
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   934
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   935
    protected void cbz(int size, Register reg, int imm21) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   936
        conditionalBranchInstruction(reg, imm21, generalFromSize(size), Instruction.CBZ, -1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   937
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   938
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   939
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   940
     * Compare register and branch if zero.
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
     * @param reg 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
   943
     * @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
   944
     * @param imm21 Signed 21-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   945
     * @param pos Position at which instruction is inserted into buffer. -1 means insert at end.
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
    protected void cbz(int size, Register reg, int imm21, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   948
        conditionalBranchInstruction(reg, imm21, generalFromSize(size), Instruction.CBZ, pos);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   949
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   950
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   951
    /**
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   952
     * Test a single bit and branch if the bit is nonzero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   953
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   954
     * @param reg general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   955
     * @param uimm6 Unsigned 6-bit bit index.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   956
     * @param imm16 signed 16 bit offset
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   957
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   958
    protected void tbnz(Register reg, int uimm6, int imm16) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   959
        tbnz(reg, uimm6, imm16, -1);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   960
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   961
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   962
    /**
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   963
     * Test a single bit and branch if the bit is zero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   964
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   965
     * @param reg general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   966
     * @param uimm6 Unsigned 6-bit bit index.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   967
     * @param imm16 signed 16 bit offset
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   968
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   969
    protected void tbz(Register reg, int uimm6, int imm16) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   970
        tbz(reg, uimm6, imm16, -1);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   971
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   972
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   973
    /**
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   974
     * Test a single bit and branch if the bit is nonzero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   975
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   976
     * @param reg general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   977
     * @param uimm6 Unsigned 6-bit bit index.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   978
     * @param imm16 signed 16 bit offset
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   979
     * @param pos Position at which instruction is inserted into buffer. -1 means insert at end.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   980
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   981
    protected void tbnz(Register reg, int uimm6, int imm16, int pos) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   982
        assert reg.getRegisterCategory().equals(CPU);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   983
        assert NumUtil.isUnsignedNbit(6, uimm6);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   984
        assert NumUtil.isSignedNbit(16, imm16) : String.format("Offset value must fit in 16 bits signed: 0x%x", imm16);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   985
        assert (imm16 & 3) == 0 : String.format("Lower two bits must be zero: 0x%x", imm16 & 3);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   986
        // size bit is overloaded as top bit of uimm6 bit index
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   987
        int size = (((uimm6 >> 5) & 1) == 0 ? 32 : 64);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   988
        // remaining 5 bits are encoded lower down
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   989
        int uimm5 = uimm6 & 0x1F;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   990
        int imm14 = (imm16 & NumUtil.getNbitNumberInt(16)) >> 2;
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   991
        InstructionType type = generalFromSize(size);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   992
        int encoding = type.encoding | TBNZ.encoding | (uimm5 << 19) | (imm14 << 5) | rd(reg);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   993
        if (pos == -1) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   994
            emitInt(encoding);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   995
        } else {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   996
            emitInt(encoding, pos);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   997
        }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   998
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
   999
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1000
    /**
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1001
     * Test a single bit and branch if the bit is zero.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1002
     *
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1003
     * @param reg general purpose register. May not be null, zero-register or stackpointer.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1004
     * @param uimm6 Unsigned 6-bit bit index.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1005
     * @param imm16 signed 16 bit offset
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1006
     * @param pos Position at which instruction is inserted into buffer. -1 means insert at end.
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1007
     */
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1008
    protected void tbz(Register reg, int uimm6, int imm16, int pos) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1009
        assert reg.getRegisterCategory().equals(CPU);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1010
        assert NumUtil.isUnsignedNbit(6, uimm6);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1011
        assert NumUtil.isSignedNbit(16, imm16) : String.format("Offset value must fit in 16 bits signed: 0x%x", imm16);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1012
        assert (imm16 & 3) == 0 : String.format("Lower two bits must be zero: 0x%x", imm16 & 3);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1013
        // size bit is overloaded as top bit of uimm6 bit index
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1014
        int size = (((uimm6 >> 5) & 1) == 0 ? 32 : 64);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1015
        // remaining 5 bits are encoded lower down
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1016
        int uimm5 = uimm6 & 0x1F;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1017
        int imm14 = (imm16 & NumUtil.getNbitNumberInt(16)) >> 2;
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1018
        InstructionType type = generalFromSize(size);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1019
        int encoding = type.encoding | TBZ.encoding | (uimm5 << 19) | (imm14 << 5) | rd(reg);
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1020
        if (pos == -1) {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1021
            emitInt(encoding);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1022
        } else {
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1023
            emitInt(encoding, pos);
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1024
        }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1025
    }
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46344
diff changeset
  1026
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1027
    private void conditionalBranchInstruction(Register reg, int imm21, InstructionType type, Instruction instr, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1028
        assert reg.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1029
        int instrEncoding = instr.encoding | CompareBranchOp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1030
        if (pos == -1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1031
            emitInt(type.encoding | instrEncoding | getConditionalBranchImm(imm21) | rd(reg));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1032
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1033
            emitInt(type.encoding | instrEncoding | getConditionalBranchImm(imm21) | rd(reg), pos);
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1037
    private static int getConditionalBranchImm(int imm21) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1038
        assert NumUtil.isSignedNbit(21, imm21) && (imm21 & 0x3) == 0 : String.format("Immediate has to be 21bit signed number and word aligned got value 0x%x", imm21);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1039
        int imm = (imm21 & NumUtil.getNbitNumberInt(21)) >> 2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1040
        return imm << ConditionalBranchImmOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1041
    }
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
    /* Unconditional Branch (immediate) (5.2.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1044
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1045
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1046
     * @param imm28 Signed 28-bit offset, has to be word aligned.
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
    protected void b(int imm28) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1049
        unconditionalBranchImmInstruction(imm28, Instruction.B, -1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1050
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1051
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1052
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1053
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1054
     * @param imm28 Signed 28-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1055
     * @param pos Position where instruction is inserted into code buffer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1056
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1057
    protected void b(int imm28, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1058
        unconditionalBranchImmInstruction(imm28, Instruction.B, pos);
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
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
     * Branch and link return address to register X30.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1063
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1064
     * @param imm28 Signed 28-bit offset, has to be word aligned.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1065
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1066
    public void bl(int imm28) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1067
        unconditionalBranchImmInstruction(imm28, Instruction.BL, -1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1068
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1069
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1070
    private void unconditionalBranchImmInstruction(int imm28, Instruction instr, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1071
        assert NumUtil.isSignedNbit(28, imm28) && (imm28 & 0x3) == 0 : "Immediate has to be 28bit signed number and word aligned";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1072
        int imm = (imm28 & NumUtil.getNbitNumberInt(28)) >> 2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1073
        int instrEncoding = instr.encoding | UnconditionalBranchImmOp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1074
        if (pos == -1) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1075
            annotatePatchingImmediate(position(), instr, 26, 0, 2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1076
            emitInt(instrEncoding | imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1077
        } else {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1078
            annotatePatchingImmediate(pos, instr, 26, 0, 2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1079
            emitInt(instrEncoding | imm, pos);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1080
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1081
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1082
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1083
    /* Unconditional Branch (register) (5.2.3) */
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1086
     * Branches to address in register and writes return address into register X30.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1087
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1088
     * @param reg 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
  1089
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1090
    public void blr(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1091
        unconditionalBranchRegInstruction(BLR, reg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1092
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1093
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
     * Branches to address in register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1096
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1097
     * @param reg 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
  1098
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1099
    protected void br(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1100
        unconditionalBranchRegInstruction(BR, reg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1101
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1102
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1103
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1104
     * Return to address in register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1105
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1106
     * @param reg 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
  1107
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1108
    public void ret(Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1109
        unconditionalBranchRegInstruction(RET, reg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1110
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1111
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1112
    private void unconditionalBranchRegInstruction(Instruction instr, Register reg) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1113
        assert reg.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1114
        assert !reg.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1115
        assert !reg.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1116
        emitInt(instr.encoding | UnconditionalBranchRegOp | rs1(reg));
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1117
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1118
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1119
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1120
    /* Load-Store Single Register (5.3.1) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1121
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1122
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1123
     * Loads a srcSize value from address into rt zero-extending it.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1124
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1125
     * @param srcSize size of memory read in bits. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1126
     * @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
  1127
     * @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
  1128
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1129
    public void ldr(int srcSize, Register rt, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1130
        assert rt.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1131
        assert srcSize == 8 || srcSize == 16 || srcSize == 32 || srcSize == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1132
        int transferSize = NumUtil.log2Ceil(srcSize / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1133
        loadStoreInstruction(LDR, rt, address, General32, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1134
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1135
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1136
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1137
     * Loads a srcSize value from address into rt sign-extending it.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1138
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1139
     * @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
  1140
     * @param srcSize size of memory read in bits. Must be 8, 16 or 32, but may not be equivalent to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1141
     *            targetSize.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1142
     * @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
  1143
     * @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
  1144
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1145
    protected 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
  1146
        assert rt.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1147
        assert (srcSize == 8 || srcSize == 16 || srcSize == 32) && srcSize != targetSize;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1148
        int transferSize = NumUtil.log2Ceil(srcSize / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1149
        loadStoreInstruction(LDRS, rt, address, generalFromSize(targetSize), transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1150
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1151
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1152
    public enum PrefetchMode {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1153
        PLDL1KEEP(0b00000),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1154
        PLDL1STRM(0b00001),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1155
        PLDL2KEEP(0b00010),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1156
        PLDL2STRM(0b00011),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1157
        PLDL3KEEP(0b00100),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1158
        PLDL3STRM(0b00101),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1159
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1160
        PLIL1KEEP(0b01000),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1161
        PLIL1STRM(0b01001),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1162
        PLIL2KEEP(0b01010),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1163
        PLIL2STRM(0b01011),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1164
        PLIL3KEEP(0b01100),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1165
        PLIL3STRM(0b01101),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1166
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1167
        PSTL1KEEP(0b10000),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1168
        PSTL1STRM(0b10001),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1169
        PSTL2KEEP(0b10010),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1170
        PSTL2STRM(0b10011),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1171
        PSTL3KEEP(0b10100),
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1172
        PSTL3STRM(0b10101);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1173
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1174
        private final int encoding;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1175
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1176
        PrefetchMode(int encoding) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1177
            this.encoding = encoding;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1178
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1179
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1180
        private static PrefetchMode[] modes = {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1181
                        PLDL1KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1182
                        PLDL1STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1183
                        PLDL2KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1184
                        PLDL2STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1185
                        PLDL3KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1186
                        PLDL3STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1187
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1188
                        null,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1189
                        null,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1190
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1191
                        PLIL1KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1192
                        PLIL1STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1193
                        PLIL2KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1194
                        PLIL2STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1195
                        PLIL3KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1196
                        PLIL3STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1197
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1198
                        null,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1199
                        null,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1200
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1201
                        PSTL1KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1202
                        PSTL1STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1203
                        PSTL2KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1204
                        PSTL2STRM,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1205
                        PSTL3KEEP,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1206
                        PSTL3STRM
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1207
        };
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1208
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1209
        public static PrefetchMode lookup(int enc) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1210
            assert enc >= 00 && enc < modes.length;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1211
            return modes[enc];
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1212
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1213
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1214
        public Register toRegister() {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1215
            return cpuRegisters.get(encoding);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1216
        }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1217
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1218
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1219
    /*
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1220
     * implements a prefetch at a 64-bit aligned address using a scaled 12 bit or unscaled 9 bit
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1221
     * displacement addressing mode
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1222
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1223
     * @param rt general purpose register. May not be null, zr or stackpointer.
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1224
     *
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1225
     * @param address only displacement addressing modes allowed. May not be null.
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1226
     */
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1227
    public void prfm(AArch64Address address, PrefetchMode mode) {
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1228
        assert (address.getAddressingMode() == AddressingMode.IMMEDIATE_SCALED ||
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1229
                        address.getAddressingMode() == AddressingMode.IMMEDIATE_UNSCALED ||
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1230
                        address.getAddressingMode() == AddressingMode.REGISTER_OFFSET);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1231
        assert mode != null;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1232
        final int srcSize = 64;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1233
        final int transferSize = NumUtil.log2Ceil(srcSize / 8);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1234
        final Register rt = mode.toRegister();
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1235
        // this looks weird but that's because loadStoreInstruction is weird
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1236
        // instruction select fields are size [31:30], v [26] and opc [25:24]
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1237
        // prfm requires size == 0b11, v == 0b0 and opc == 0b11
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1238
        // passing LDRS ensures opc[1] == 0b1
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1239
        // (n.b. passing LDR/STR makes no difference to opc[1:0]!!)
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1240
        // passing General64 ensures opc[0] == 0b1 and v = 0b0
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1241
        // (n.b. passing General32 ensures opc[0] == 0b0 and v = 0b0)
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1242
        // srcSize 64 ensures size == 0b11
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1243
        loadStoreInstruction(LDRS, rt, address, General64, transferSize);
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1244
    }
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1245
43972
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
     * Stores register rt into memory pointed by address.
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 destSize number of bits written to memory. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1250
     * @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
  1251
     * @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
  1252
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1253
    public void str(int destSize, Register rt, AArch64Address address) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  1254
        assert rt.getRegisterCategory().equals(CPU) : rt;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1255
        assert destSize == 8 || destSize == 16 || destSize == 32 || destSize == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1256
        int transferSize = NumUtil.log2Ceil(destSize / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1257
        loadStoreInstruction(STR, rt, address, General64, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1258
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1259
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1260
    private void loadStoreInstruction(Instruction instr, Register reg, AArch64Address address, InstructionType type, int log2TransferSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1261
        assert log2TransferSize >= 0 && log2TransferSize < 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1262
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1263
        int is32Bit = type.width == 32 ? 1 << ImmediateSizeOffset : 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1264
        int isFloat = !type.isGeneral ? 1 << LoadStoreFpFlagOffset : 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1265
        int memop = instr.encoding | transferSizeEncoding | is32Bit | isFloat | rt(reg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1266
        switch (address.getAddressingMode()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1267
            case IMMEDIATE_SCALED:
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1268
                annotatePatchingImmediate(position(), instr, 12, LoadStoreScaledImmOffset, log2TransferSize);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1269
                emitInt(memop | LoadStoreScaledOp | address.getImmediate() << LoadStoreScaledImmOffset | rs1(address.getBase()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1270
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1271
            case IMMEDIATE_UNSCALED:
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1272
                annotatePatchingImmediate(position(), instr, 9, LoadStoreUnscaledImmOffset, 0);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1273
                emitInt(memop | LoadStoreUnscaledOp | address.getImmediate() << LoadStoreUnscaledImmOffset | rs1(address.getBase()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1274
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1275
            case BASE_REGISTER_ONLY:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1276
                emitInt(memop | LoadStoreScaledOp | rs1(address.getBase()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1277
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1278
            case EXTENDED_REGISTER_OFFSET:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1279
            case REGISTER_OFFSET:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1280
                ExtendType extendType = address.getAddressingMode() == AddressingMode.EXTENDED_REGISTER_OFFSET ? address.getExtendType() : ExtendType.UXTX;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1281
                boolean shouldScale = address.isScaled() && log2TransferSize != 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1282
                emitInt(memop | LoadStoreRegisterOp | rs2(address.getOffset()) | extendType.encoding << ExtendTypeOffset | (shouldScale ? 1 : 0) << LoadStoreScaledRegOffset | rs1(address.getBase()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1283
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1284
            case PC_LITERAL:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1285
                assert log2TransferSize >= 2 : "PC literal loads only works for load/stores of 32-bit and larger";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1286
                transferSizeEncoding = (log2TransferSize - 2) << LoadStoreTransferSizeOffset;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1287
                annotatePatchingImmediate(position(), instr, 21, LoadLiteralImmeOffset, 2);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1288
                emitInt(transferSizeEncoding | isFloat | LoadLiteralOp | rd(reg) | address.getImmediate() << LoadLiteralImmeOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1289
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1290
            case IMMEDIATE_POST_INDEXED:
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1291
                annotatePatchingImmediate(position(), instr, 9, LoadStoreIndexedImmOffset, 0);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1292
                emitInt(memop | LoadStorePostIndexedOp | rs1(address.getBase()) | address.getImmediate() << LoadStoreIndexedImmOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1293
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1294
            case IMMEDIATE_PRE_INDEXED:
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1295
                annotatePatchingImmediate(position(), instr, 9, LoadStoreIndexedImmOffset, 0);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1296
                emitInt(memop | LoadStorePreIndexedOp | rs1(address.getBase()) | address.getImmediate() << LoadStoreIndexedImmOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1297
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1298
            default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1299
                throw GraalError.shouldNotReachHere("Unhandled addressing mode: " + address.getAddressingMode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1300
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1301
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1302
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1303
    /**
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1304
     * Load Pair of Registers calculates an address from a base register value and an immediate
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1305
     * offset, and stores two 32-bit words or two 64-bit doublewords to the calculated address, from
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1306
     * two registers.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1307
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1308
    public void ldp(int size, Register rt, Register rt2, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1309
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1310
        loadStorePairInstruction(LDP, rt, rt2, address, generalFromSize(size));
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1314
     * Store Pair of Registers calculates an address from a base register value and an immediate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1315
     * offset, and stores two 32-bit words or two 64-bit doublewords to the calculated address, from
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1316
     * two registers.
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
    public void stp(int size, Register rt, Register rt2, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1319
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1320
        loadStorePairInstruction(STP, rt, rt2, address, generalFromSize(size));
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1323
    private void loadStorePairInstruction(Instruction instr, Register rt, Register rt2, AArch64Address address, InstructionType type) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1324
        int scaledOffset = maskField(7, address.getImmediateRaw());  // LDP/STP use a 7-bit scaled
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1325
                                                                     // offset
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1326
        int memop = type.encoding | instr.encoding | scaledOffset << LoadStorePairImm7Offset | rt2(rt2) | rn(address.getBase()) | rt(rt);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1327
        switch (address.getAddressingMode()) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1328
            case IMMEDIATE_SCALED:
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1329
                emitInt(memop | LoadStorePairOp | (0b010 << 23));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1330
                break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1331
            case IMMEDIATE_POST_INDEXED:
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1332
                emitInt(memop | LoadStorePairOp | (0b001 << 23));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1333
                break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1334
            case IMMEDIATE_PRE_INDEXED:
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1335
                emitInt(memop | LoadStorePairOp | (0b011 << 23));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1336
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1337
            default:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1338
                throw GraalError.shouldNotReachHere("Unhandled addressing mode: " + address.getAddressingMode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1339
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1340
    }
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
    /* Load-Store Exclusive (5.3.6) */
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1345
     * Load address exclusive. Natural alignment of address is required.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1346
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1347
     * @param size size of memory read in bits. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1348
     * @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
  1349
     * @param rn general purpose register.
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
    protected void ldxr(int size, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1352
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1353
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1354
        exclusiveLoadInstruction(LDXR, rt, rn, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1355
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1356
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1357
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1358
     * Store address exclusive. Natural alignment of address is required. rs and rt may not point to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1359
     * the same register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1360
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1361
     * @param size size of bits written to memory. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1362
     * @param rs general purpose register. Set to exclusive access status. 0 means success,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1363
     *            everything else failure. May not be null, or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1364
     * @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
  1365
     * @param rn general purpose register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1366
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1367
    protected void stxr(int size, Register rs, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1368
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1369
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1370
        exclusiveStoreInstruction(STXR, rs, rt, rn, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1371
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1372
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1373
    /* Load-Acquire/Store-Release (5.3.7) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1374
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1375
    /* non exclusive access */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1376
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1377
     * Load acquire. Natural alignment of address is required.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1378
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1379
     * @param size size of memory read in bits. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1380
     * @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
  1381
     * @param rn general purpose register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1382
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1383
    protected void ldar(int size, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1384
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1385
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1386
        exclusiveLoadInstruction(LDAR, rt, rn, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1387
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1388
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1389
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1390
     * Store-release. Natural alignment of address is required.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1391
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1392
     * @param size size of bits written to memory. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1393
     * @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
  1394
     * @param rn general purpose register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1395
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1396
    protected void stlr(int size, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1397
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1398
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1399
        // Hack: Passing the zero-register means it is ignored when building the encoding.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1400
        exclusiveStoreInstruction(STLR, r0, rt, rn, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1401
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1402
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1403
    /* exclusive access */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1404
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1405
     * Load acquire exclusive. Natural alignment of address is required.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1406
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1407
     * @param size size of memory read in bits. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1408
     * @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
  1409
     * @param rn general purpose register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1410
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1411
    public void ldaxr(int size, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1412
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1413
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1414
        exclusiveLoadInstruction(LDAXR, rt, rn, transferSize);
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1418
     * Store-release exclusive. Natural alignment of address is required. rs and rt may not point to
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1419
     * the same register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1420
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1421
     * @param size size of bits written to memory. Must be 8, 16, 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1422
     * @param rs general purpose register. Set to exclusive access status. 0 means success,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1423
     *            everything else failure. May not be null, or stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1424
     * @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
  1425
     * @param rn general purpose register.
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
    public void stlxr(int size, Register rs, Register rt, Register rn) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1428
        assert size == 8 || size == 16 || size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1429
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1430
        exclusiveStoreInstruction(STLXR, rs, rt, rn, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1431
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1432
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1433
    private void exclusiveLoadInstruction(Instruction instr, Register reg, Register rn, int log2TransferSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1434
        assert log2TransferSize >= 0 && log2TransferSize < 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1435
        assert reg.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1436
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1437
        emitInt(transferSizeEncoding | instr.encoding | 1 << ImmediateSizeOffset | rn(rn) | rt(reg));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1438
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1439
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1440
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1441
     * Stores data from rt into address and sets rs to the returned exclusive access status.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1442
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1443
     * @param rs general purpose register into which the exclusive access status is written. May not
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1444
     *            be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1445
     * @param rt general purpose register containing data to be written to memory at address. May
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1446
     *            not be null
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1447
     * @param rn general purpose register containing the address specifying where rt is written to.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1448
     * @param log2TransferSize log2Ceil of memory transfer size.
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
    private void exclusiveStoreInstruction(Instruction instr, Register rs, Register rt, Register rn, int log2TransferSize) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1451
        assert log2TransferSize >= 0 && log2TransferSize < 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1452
        assert rt.getRegisterCategory().equals(CPU) && rs.getRegisterCategory().equals(CPU) && !rs.equals(rt);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1453
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1454
        emitInt(transferSizeEncoding | instr.encoding | rs2(rs) | rn(rn) | rt(rt));
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
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1457
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1458
     * Compare And Swap word or doubleword in memory. This reads a value from an address rn,
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1459
     * compares it against a given value rs, and, if equal, stores the value rt to memory. The value
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1460
     * read from address rn is stored in register rs.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1461
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1462
     * @param size size of bits read from memory. Must be 32 or 64.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1463
     * @param rs general purpose register to be compared and loaded. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1464
     * @param rt general purpose register to be conditionally stored. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1465
     * @param rn general purpose register containing the address from which to read.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1466
     * @param acquire boolean value signifying if the load should use acquire semantics.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1467
     * @param release boolean value signifying if the store should use release semantics.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1468
     */
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1469
    public void cas(int size, Register rs, Register rt, Register rn, boolean acquire, boolean release) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1470
        assert size == 32 || size == 64;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1471
        int transferSize = NumUtil.log2Ceil(size / 8);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1472
        compareAndSwapInstruction(CAS, rs, rt, rn, transferSize, acquire, release);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1473
    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1474
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1475
    private void compareAndSwapInstruction(Instruction instr, Register rs, Register rt, Register rn, int log2TransferSize, boolean acquire, boolean release) {
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1476
        assert log2TransferSize >= 0 && log2TransferSize < 4;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1477
        assert rt.getRegisterCategory().equals(CPU) && rs.getRegisterCategory().equals(CPU) && !rs.equals(rt);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1478
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1479
        emitInt(transferSizeEncoding | instr.encoding | rs2(rs) | rn(rn) | rt(rt) | (acquire ? 1 : 0) << CASAcquireOffset | (release ? 1 : 0) << CASReleaseOffset);
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1480
    }
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1481
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1482
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1483
     * Atomic add. This reads a value from an address rn, stores the value in rt, and adds the value
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1484
     * in rs to it, and stores the result back at address rn. The initial value read from memory is
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1485
     * stored in rt.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1486
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1487
     * @param size size of operand to read from memory. Must be 8, 16, 32, or 64.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1488
     * @param rs general purpose register to be added to contents. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1489
     * @param rt general purpose register to be loaded. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1490
     * @param rn general purpose register or stack pointer holding an address from which to load.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1491
     * @param acquire boolean value signifying if the load should use acquire semantics.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1492
     * @param release boolean value signifying if the store should use release semantics.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1493
     */
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1494
    public void ldadd(int size, Register rs, Register rt, Register rn, boolean acquire, boolean release) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1495
        assert size == 8 || size == 16 || size == 32 || size == 64;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1496
        int transferSize = NumUtil.log2Ceil(size / 8);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1497
        loadAndAddInstruction(LDADD, rs, rt, rn, transferSize, acquire, release);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1498
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1499
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1500
    private void loadAndAddInstruction(Instruction instr, Register rs, Register rt, Register rn, int log2TransferSize, boolean acquire, boolean release) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1501
        assert log2TransferSize >= 0 && log2TransferSize < 4;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1502
        assert rt.getRegisterCategory().equals(CPU) && rs.getRegisterCategory().equals(CPU) && !rs.equals(rt);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1503
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1504
        emitInt(transferSizeEncoding | instr.encoding | rs2(rs) | rn(rn) | rt(rt) | (acquire ? 1 : 0) << LDADDAcquireOffset | (release ? 1 : 0) << LDADDReleaseOffset);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1505
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1506
50609
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1507
    /**
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1508
     * Atomic swap. This reads a value from an address rn, stores the value in rt, and then stores
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1509
     * the value in rs back at address rn.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1510
     *
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1511
     * @param size size of operand to read from memory. Must be 8, 16, 32, or 64.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1512
     * @param rs general purpose register to be stored. May not be null.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1513
     * @param rt general purpose register to be loaded. May not be null.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1514
     * @param rn general purpose register or stack pointer holding an address from which to load.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1515
     * @param acquire boolean value signifying if the load should use acquire semantics.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1516
     * @param release boolean value signifying if the store should use release semantics.
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1517
     */
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1518
    public void swp(int size, Register rs, Register rt, Register rn, boolean acquire, boolean release) {
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1519
        assert size == 8 || size == 16 || size == 32 || size == 64;
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1520
        int transferSize = NumUtil.log2Ceil(size / 8);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1521
        swapInstruction(SWP, rs, rt, rn, transferSize, acquire, release);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1522
    }
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1523
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1524
    private void swapInstruction(Instruction instr, Register rs, Register rt, Register rn, int log2TransferSize, boolean acquire, boolean release) {
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1525
        assert log2TransferSize >= 0 && log2TransferSize < 4;
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1526
        assert rt.getRegisterCategory().equals(CPU) && rs.getRegisterCategory().equals(CPU) && !rs.equals(rt);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1527
        int transferSizeEncoding = log2TransferSize << LoadStoreTransferSizeOffset;
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1528
        emitInt(transferSizeEncoding | instr.encoding | rs2(rs) | rn(rn) | rt(rt) | (acquire ? 1 : 0) << LDADDAcquireOffset | (release ? 1 : 0) << LDADDReleaseOffset);
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1529
    }
bf414874c28f 8204231: Update Graal
dlong
parents: 50330
diff changeset
  1530
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1531
    /* PC-relative Address Calculation (5.4.4) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1532
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
     * Address of page: sign extends 21-bit offset, shifts if left by 12 and adds it to the value of
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1535
     * the PC with its bottom 12-bits cleared, writing the result to dst. No offset is emitted; the
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1536
     * instruction will be patched later.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1537
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1538
     * @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
  1539
     */
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 49873
diff changeset
  1540
    public void adrp(Register dst) {
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1541
        emitInt(ADRP.encoding | PcRelImmOp | rd(dst));
50104
4ea7917929b9 8185505: AArch64: Port AOT to AArch64
aph
parents: 49873
diff changeset
  1542
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1543
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1544
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1545
     * Adds a 21-bit signed offset to the program counter and writes the result to dst.
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
     * @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
  1548
     * @param imm21 Signed 21-bit offset.
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
    public void adr(Register dst, int imm21) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1551
        emitInt(ADR.encoding | PcRelImmOp | rd(dst) | getPcRelativeImmEncoding(imm21));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1552
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1553
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1554
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1555
     * Adds a 21-bit signed offset to the program counter and writes the result to dst.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1556
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1557
     * @param dst general purpose register. May not be null, zero-register or stackpointer.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1558
     * @param imm21 Signed 21-bit offset.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1559
     * @param pos the position in the code that the instruction is emitted.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  1560
     */
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1561
    public void adr(Register dst, int imm21, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1562
        emitInt(ADR.encoding | PcRelImmOp | rd(dst) | getPcRelativeImmEncoding(imm21), pos);
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1565
    private static int getPcRelativeImmEncoding(int imm21) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1566
        assert NumUtil.isSignedNbit(21, imm21);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1567
        int imm = imm21 & NumUtil.getNbitNumberInt(21);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1568
        // higher 19 bit
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1569
        int immHi = (imm >> 2) << PcRelImmHiOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1570
        // lower 2 bit
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1571
        int immLo = (imm & 0x3) << PcRelImmLoOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1572
        return immHi | immLo;
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
    /* Arithmetic (Immediate) (5.4.1) */
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1578
     * dst = src + aimm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1579
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1580
     * @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
  1581
     * @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
  1582
     * @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
  1583
     * @param aimm arithmetic immediate. Either unsigned 12-bit value or unsigned 24-bit value with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1584
     *            the lower 12-bit cleared.
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
    protected void add(int size, Register dst, Register src, int aimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1587
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1588
        assert !src.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1589
        addSubImmInstruction(ADD, dst, src, aimm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1590
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1591
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
     * dst = src + aimm and sets condition flags.
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
     * @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
  1596
     * @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
  1597
     * @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
  1598
     * @param aimm arithmetic immediate. Either unsigned 12-bit value or unsigned 24-bit value with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1599
     *            the lower 12-bit cleared.
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
    protected void adds(int size, Register dst, Register src, int aimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1602
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1603
        assert !src.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1604
        addSubImmInstruction(ADDS, dst, src, aimm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1605
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1606
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1607
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1608
     * dst = src - aimm.
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
     * @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
  1611
     * @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
  1612
     * @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
  1613
     * @param aimm arithmetic immediate. Either unsigned 12-bit value or unsigned 24-bit value with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1614
     *            the lower 12-bit cleared.
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
    protected void sub(int size, Register dst, Register src, int aimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1617
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1618
        assert !src.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1619
        addSubImmInstruction(SUB, dst, src, aimm, generalFromSize(size));
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
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
     * dst = src - aimm and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1624
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1625
     * @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
  1626
     * @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
  1627
     * @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
  1628
     * @param aimm arithmetic immediate. Either unsigned 12-bit value or unsigned 24-bit value with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1629
     *            the lower 12-bit cleared.
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
    protected void subs(int size, Register dst, Register src, int aimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1632
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1633
        assert !src.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1634
        addSubImmInstruction(SUBS, dst, src, aimm, generalFromSize(size));
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
    private void addSubImmInstruction(Instruction instr, Register dst, Register src, int aimm, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1638
        emitInt(type.encoding | instr.encoding | AddSubImmOp | encodeAimm(aimm) | rd(dst) | rs1(src));
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
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1641
    public void ccmp(int size, Register x, Register y, int aimm, ConditionFlag condition) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1642
        emitInt(generalFromSize(size).encoding | CCMP.encoding | rs1(x) | rs2(y) | encodeAimm(aimm) | condition.encoding << ConditionalConditionOffset);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1643
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  1644
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1645
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1646
     * Encodes arithmetic immediate.
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
     * @param imm Immediate has to be either an unsigned 12-bit value or an unsigned 24-bit value
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1649
     *            with the lower 12 bits zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1650
     * @return Representation of immediate for use with arithmetic instructions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1651
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1652
    private static int encodeAimm(int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1653
        assert isAimm(imm) : "Immediate has to be legal arithmetic immediate value " + imm;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1654
        if (NumUtil.isUnsignedNbit(12, imm)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1655
            return imm << ImmediateOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1656
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1657
            // First 12-bit are zero, so shift immediate 12-bit and set flag to indicate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1658
            // shifted immediate value.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1659
            return (imm >>> 12 << ImmediateOffset) | AddSubShift12;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1660
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1661
    }
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
     * Checks whether immediate can be encoded as an arithmetic immediate.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1665
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1666
     * @param imm Immediate has to be either an unsigned 12bit value or un unsigned 24bit value with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1667
     *            the lower 12 bits 0.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1668
     * @return true if valid arithmetic immediate, false otherwise.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1669
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1670
    protected static boolean isAimm(int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1671
        return NumUtil.isUnsignedNbit(12, imm) || NumUtil.isUnsignedNbit(12, imm >>> 12) && (imm & 0xfff) == 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1672
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1673
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1674
    /* Logical (immediate) (5.4.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1675
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1676
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1677
     * dst = src & bimm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1678
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1679
     * @param size register size. Has to be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1680
     * @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
  1681
     * @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
  1682
     * @param bimm logical immediate. See {@link LogicalImmediateTable} for exact definition.
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
    public void and(int size, Register dst, Register src, long bimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1685
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1686
        assert !src.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1687
        logicalImmInstruction(AND, dst, src, bimm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1688
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1689
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1690
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1691
     * dst = src & bimm and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1692
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1693
     * @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
  1694
     * @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
  1695
     * @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
  1696
     * @param bimm logical immediate. See {@link LogicalImmediateTable} for exact definition.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1697
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1698
    public void ands(int size, Register dst, Register src, long bimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1699
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1700
        assert !src.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1701
        logicalImmInstruction(ANDS, dst, src, bimm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1702
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1703
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1704
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1705
     * dst = src ^ bimm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1706
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1707
     * @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
  1708
     * @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
  1709
     * @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
  1710
     * @param bimm logical immediate. See {@link LogicalImmediateTable} for exact definition.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1711
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1712
    public void eor(int size, Register dst, Register src, long bimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1713
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1714
        assert !src.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1715
        logicalImmInstruction(EOR, dst, src, bimm, generalFromSize(size));
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1718
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1719
     * dst = src | bimm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1720
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1721
     * @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
  1722
     * @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
  1723
     * @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
  1724
     * @param bimm logical immediate. See {@link LogicalImmediateTable} for exact definition.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1725
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1726
    protected void orr(int size, Register dst, Register src, long bimm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1727
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1728
        assert !src.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1729
        logicalImmInstruction(ORR, dst, src, bimm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1730
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1731
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1732
    private void logicalImmInstruction(Instruction instr, Register dst, Register src, long bimm, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1733
        // Mask higher bits off, since we always pass longs around even for the 32-bit instruction.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1734
        long bimmValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1735
        if (type == General32) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1736
            assert (bimm >> 32) == 0 || (bimm >> 32) == -1L : "Higher order bits for 32-bit instruction must either all be 0 or 1.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1737
            bimmValue = bimm & NumUtil.getNbitNumberLong(32);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1738
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1739
            bimmValue = bimm;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1740
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1741
        int immEncoding = LogicalImmediateTable.getLogicalImmEncoding(type == General64, bimmValue);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1742
        emitInt(type.encoding | instr.encoding | LogicalImmOp | immEncoding | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1743
    }
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
    /* Move (wide immediate) (5.4.3) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1746
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
     * dst = uimm16 << shiftAmt.
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
     * @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
  1751
     * @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
  1752
     * @param uimm16 16-bit unsigned immediate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1753
     * @param shiftAmt amount by which uimm16 is left shifted. Can be any multiple of 16 smaller
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1754
     *            than size.
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
    protected void movz(int size, Register dst, int uimm16, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1757
        moveWideImmInstruction(MOVZ, dst, uimm16, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1758
    }
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
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1761
     * dst = ~(uimm16 << shiftAmt).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1762
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1763
     * @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
  1764
     * @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
  1765
     * @param uimm16 16-bit unsigned immediate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1766
     * @param shiftAmt amount by which uimm16 is left shifted. Can be any multiple of 16 smaller
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1767
     *            than size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1768
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1769
    protected void movn(int size, Register dst, int uimm16, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1770
        moveWideImmInstruction(MOVN, dst, uimm16, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1771
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1772
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1773
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1774
     * dst<pos+15:pos> = uimm16.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1775
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1776
     * @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
  1777
     * @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
  1778
     * @param uimm16 16-bit unsigned immediate
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1779
     * @param pos position into which uimm16 is inserted. Can be any multiple of 16 smaller than
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1780
     *            size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1781
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1782
    protected void movk(int size, Register dst, int uimm16, int pos) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1783
        moveWideImmInstruction(MOVK, dst, uimm16, pos, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1784
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1785
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1786
    private void moveWideImmInstruction(Instruction instr, Register dst, int uimm16, int shiftAmt, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1787
        assert dst.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1788
        assert NumUtil.isUnsignedNbit(16, uimm16) : "Immediate has to be unsigned 16bit";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1789
        assert shiftAmt == 0 || shiftAmt == 16 || (type == InstructionType.General64 && (shiftAmt == 32 || shiftAmt == 48)) : "Invalid shift amount: " + shiftAmt;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1790
        int shiftValue = shiftAmt >> 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1791
        emitInt(type.encoding | instr.encoding | MoveWideImmOp | rd(dst) | uimm16 << MoveWideImmOffset | shiftValue << MoveWideShiftOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1792
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1793
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1794
    /* Bitfield Operations (5.4.5) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1795
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1796
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1797
     * Bitfield move.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1798
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1799
     * @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
  1800
     * @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
  1801
     * @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
  1802
     * @param r must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1803
     * @param s must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1804
     */
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1805
    public void bfm(int size, Register dst, Register src, int r, int s) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1806
        bitfieldInstruction(BFM, dst, src, r, s, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1807
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1808
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1809
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1810
     * Unsigned bitfield move.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1811
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1812
     * @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
  1813
     * @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
  1814
     * @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
  1815
     * @param r must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1816
     * @param s must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1817
     */
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 47216
diff changeset
  1818
    public void ubfm(int size, Register dst, Register src, int r, int s) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1819
        bitfieldInstruction(UBFM, dst, src, r, s, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1820
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1821
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1822
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1823
     * Signed bitfield move.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1824
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1825
     * @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
  1826
     * @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
  1827
     * @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
  1828
     * @param r must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1829
     * @param s must be in the range 0 to size - 1
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1830
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1831
    protected void sbfm(int size, Register dst, Register src, int r, int s) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1832
        bitfieldInstruction(SBFM, dst, src, r, s, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1833
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1834
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1835
    private void bitfieldInstruction(Instruction instr, Register dst, Register src, int r, int s, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1836
        assert !dst.equals(sp) && !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1837
        assert !src.equals(sp) && !src.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1838
        assert s >= 0 && s < type.width && r >= 0 && r < type.width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1839
        int sf = type == General64 ? 1 << ImmediateSizeOffset : 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1840
        emitInt(type.encoding | instr.encoding | BitfieldImmOp | sf | r << ImmediateRotateOffset | s << ImmediateOffset | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1841
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1842
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1843
    /* Extract (Immediate) (5.4.6) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1844
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1845
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1846
     * Extract. dst = src1:src2<lsb+31:lsb>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1847
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1848
     * @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
  1849
     * @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
  1850
     * @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
  1851
     * @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
  1852
     * @param lsb must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1853
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1854
    protected void extr(int size, Register dst, Register src1, Register src2, int lsb) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1855
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1856
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1857
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1858
        InstructionType type = generalFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1859
        assert lsb >= 0 && lsb < type.width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1860
        int sf = type == General64 ? 1 << ImmediateSizeOffset : 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1861
        emitInt(type.encoding | EXTR.encoding | sf | lsb << ImmediateOffset | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1862
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1863
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1864
    /* Arithmetic (shifted register) (5.5.1) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1865
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1866
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1867
     * dst = src1 + shiftType(src2, imm).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1868
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1869
     * @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
  1870
     * @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
  1871
     * @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
  1872
     * @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
  1873
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1874
     * @param imm must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1875
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1876
    protected void add(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1877
        addSubShiftedInstruction(ADD, dst, src1, src2, shiftType, imm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1878
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1879
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1880
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1881
     * dst = src1 + shiftType(src2, imm) and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1882
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1883
     * @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
  1884
     * @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
  1885
     * @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
  1886
     * @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
  1887
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1888
     * @param imm must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1889
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1890
    public void adds(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int imm) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1891
        addSubShiftedInstruction(ADDS, dst, src1, src2, shiftType, imm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1892
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1893
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1894
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1895
     * dst = src1 - shiftType(src2, imm).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1896
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1897
     * @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
  1898
     * @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
  1899
     * @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
  1900
     * @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
  1901
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1902
     * @param imm must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1903
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1904
    protected void sub(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1905
        addSubShiftedInstruction(SUB, dst, src1, src2, shiftType, imm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1906
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1907
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1908
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1909
     * dst = src1 - shiftType(src2, imm) and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1910
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1911
     * @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
  1912
     * @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
  1913
     * @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
  1914
     * @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
  1915
     * @param shiftType any type but ROR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1916
     * @param imm must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1917
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1918
    public void subs(int size, Register dst, Register src1, Register src2, ShiftType shiftType, int imm) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1919
        addSubShiftedInstruction(SUBS, dst, src1, src2, shiftType, imm, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1920
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1921
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1922
    private void addSubShiftedInstruction(Instruction instr, Register dst, Register src1, Register src2, ShiftType shiftType, int imm, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1923
        assert shiftType != ShiftType.ROR;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1924
        assert imm >= 0 && imm < type.width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1925
        emitInt(type.encoding | instr.encoding | AddSubShiftedOp | imm << ImmediateOffset | shiftType.encoding << ShiftTypeOffset | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1926
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1927
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1928
    /* Arithmetic (extended register) (5.5.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1929
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1930
     * dst = src1 + extendType(src2) << imm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1931
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1932
     * @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
  1933
     * @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
  1934
     * @param src1 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
  1935
     * @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
  1936
     * @param extendType defines how src2 is extended to the same size as src1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1937
     * @param shiftAmt must be in range 0 to 4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1938
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1939
    public void add(int size, Register dst, Register src1, Register src2, ExtendType extendType, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1940
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1941
        assert !src1.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1942
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1943
        addSubExtendedInstruction(ADD, dst, src1, src2, extendType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1944
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1945
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1946
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1947
     * dst = src1 + extendType(src2) << imm and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1948
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1949
     * @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
  1950
     * @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
  1951
     * @param src1 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
  1952
     * @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
  1953
     * @param extendType defines how src2 is extended to the same size as src1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1954
     * @param shiftAmt must be in range 0 to 4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1955
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1956
    protected void adds(int size, Register dst, Register src1, Register src2, ExtendType extendType, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1957
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1958
        assert !src1.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1959
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1960
        addSubExtendedInstruction(ADDS, dst, src1, src2, extendType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1961
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1962
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1963
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1964
     * dst = src1 - extendType(src2) << imm.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1965
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1966
     * @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
  1967
     * @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
  1968
     * @param src1 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
  1969
     * @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
  1970
     * @param extendType defines how src2 is extended to the same size as src1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1971
     * @param shiftAmt must be in range 0 to 4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1972
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1973
    protected void sub(int size, Register dst, Register src1, Register src2, ExtendType extendType, int shiftAmt) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1974
        assert !dst.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1975
        assert !src1.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1976
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1977
        addSubExtendedInstruction(SUB, dst, src1, src2, extendType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1978
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1979
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1980
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1981
     * dst = src1 - extendType(src2) << imm and sets flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1982
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1983
     * @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
  1984
     * @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
  1985
     * @param src1 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
  1986
     * @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
  1987
     * @param extendType defines how src2 is extended to the same size as src1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1988
     * @param shiftAmt must be in range 0 to 4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1989
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1990
    public void subs(int size, Register dst, Register src1, Register src2, ExtendType extendType, int shiftAmt) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1991
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1992
        assert !src1.equals(zr);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1993
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1994
        addSubExtendedInstruction(SUBS, dst, src1, src2, extendType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1995
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1996
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1997
    private void addSubExtendedInstruction(Instruction instr, Register dst, Register src1, Register src2, ExtendType extendType, int shiftAmt, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1998
        assert shiftAmt >= 0 && shiftAmt <= 4;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1999
        emitInt(type.encoding | instr.encoding | AddSubExtendedOp | shiftAmt << ImmediateOffset | extendType.encoding << ExtendTypeOffset | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2000
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2001
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2002
    /* Logical (shifted register) (5.5.3) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2003
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2004
     * dst = src1 & shiftType(src2, imm).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2005
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2006
     * @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
  2007
     * @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
  2008
     * @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
  2009
     * @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
  2010
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2011
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2012
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2013
    protected void and(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
  2014
        logicalRegInstruction(AND, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2015
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2016
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2017
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2018
     * dst = src1 & shiftType(src2, imm) and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2019
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2020
     * @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
  2021
     * @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
  2022
     * @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
  2023
     * @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
  2024
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2025
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2026
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2027
    protected void ands(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
  2028
        logicalRegInstruction(ANDS, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2029
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2030
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2031
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2032
     * dst = src1 & ~(shiftType(src2, imm)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2033
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2034
     * @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
  2035
     * @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
  2036
     * @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
  2037
     * @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
  2038
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2039
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2040
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2041
    protected void bic(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
  2042
        logicalRegInstruction(BIC, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2043
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2044
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2045
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2046
     * dst = src1 & ~(shiftType(src2, imm)) and sets condition flags.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2047
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2048
     * @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
  2049
     * @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
  2050
     * @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
  2051
     * @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
  2052
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2053
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2054
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2055
    protected void bics(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
  2056
        logicalRegInstruction(BICS, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2057
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2058
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2059
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2060
     * dst = src1 ^ ~(shiftType(src2, imm)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2061
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2062
     * @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
  2063
     * @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
  2064
     * @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
  2065
     * @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
  2066
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2067
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2068
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2069
    protected void eon(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
  2070
        logicalRegInstruction(EON, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2071
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2072
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2073
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2074
     * dst = src1 ^ shiftType(src2, imm).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2075
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2076
     * @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
  2077
     * @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
  2078
     * @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
  2079
     * @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
  2080
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2081
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2082
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2083
    protected void eor(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
  2084
        logicalRegInstruction(EOR, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2085
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2086
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2087
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2088
     * dst = src1 | shiftType(src2, imm).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2089
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2090
     * @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
  2091
     * @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
  2092
     * @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
  2093
     * @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
  2094
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2095
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2096
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2097
    protected void orr(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
  2098
        logicalRegInstruction(ORR, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2099
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2100
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2101
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2102
     * dst = src1 | ~(shiftType(src2, imm)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2103
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2104
     * @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
  2105
     * @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
  2106
     * @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
  2107
     * @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
  2108
     * @param shiftType all types allowed, may not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2109
     * @param shiftAmt must be in range 0 to size - 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2110
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2111
    protected void orn(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
  2112
        logicalRegInstruction(ORN, dst, src1, src2, shiftType, shiftAmt, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2113
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2114
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2115
    private void logicalRegInstruction(Instruction instr, Register dst, Register src1, Register src2, ShiftType shiftType, int shiftAmt, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2116
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2117
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2118
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2119
        assert shiftAmt >= 0 && shiftAmt < type.width;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2120
        emitInt(type.encoding | instr.encoding | LogicalShiftOp | shiftAmt << ImmediateOffset | shiftType.encoding << ShiftTypeOffset | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2121
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2122
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2123
    /* Variable Shift (5.5.4) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2124
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2125
     * dst = src1 >> (src2 & log2(size)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2126
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2127
     * @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
  2128
     * @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
  2129
     * @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
  2130
     * @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
  2131
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2132
    protected void asr(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2133
        dataProcessing2SourceOp(ASRV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2134
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2135
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2136
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2137
     * dst = src1 << (src2 & log2(size)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2138
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2139
     * @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
  2140
     * @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
  2141
     * @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
  2142
     * @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
  2143
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2144
    protected void lsl(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2145
        dataProcessing2SourceOp(LSLV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2146
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2147
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2148
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2149
     * dst = src1 >>> (src2 & log2(size)).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2150
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2151
     * @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
  2152
     * @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
  2153
     * @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
  2154
     * @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
  2155
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2156
    protected void lsr(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2157
        dataProcessing2SourceOp(LSRV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2158
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2159
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2160
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2161
     * dst = rotateRight(src1, (src2 & log2(size))).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2162
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2163
     * @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
  2164
     * @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
  2165
     * @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
  2166
     * @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
  2167
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2168
    protected void ror(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2169
        dataProcessing2SourceOp(RORV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2170
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2171
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2172
    /* Bit Operations (5.5.5) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2173
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2174
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2175
     * Counts leading sign bits. Sets Wd to the number of consecutive bits following the topmost bit
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2176
     * in dst, that are the same as the topmost bit. The count does not include the topmost bit
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2177
     * itself , so the result will be in the range 0 to size-1 inclusive.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2178
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2179
     * @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
  2180
     * @param dst general purpose register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2181
     * @param src source register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2182
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2183
    protected void cls(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2184
        dataProcessing1SourceOp(CLS, dst, src, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2185
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2186
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2187
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2188
     * Counts leading zeros.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2189
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2190
     * @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
  2191
     * @param dst general purpose register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2192
     * @param src source register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2193
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2194
    public void clz(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2195
        dataProcessing1SourceOp(CLZ, dst, src, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2196
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2197
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2198
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2199
     * Reverses bits.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2200
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2201
     * @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
  2202
     * @param dst general purpose register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2203
     * @param src source register. May not be null, zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2204
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  2205
    public void rbit(int size, Register dst, Register src) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2206
        dataProcessing1SourceOp(RBIT, dst, src, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2207
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2208
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2209
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2210
     * Reverses bytes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2211
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2212
     * @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
  2213
     * @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
  2214
     * @param src source register. May not be null or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2215
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2216
    public void rev(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2217
        if (size == 64) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2218
            dataProcessing1SourceOp(REVX, dst, src, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2219
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2220
            assert size == 32;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2221
            dataProcessing1SourceOp(REVW, dst, src, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2222
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2223
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2224
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2225
    /* Conditional Data Processing (5.5.6) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2226
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2227
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2228
     * Conditional select. dst = src1 if condition else src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2229
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2230
     * @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
  2231
     * @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
  2232
     * @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
  2233
     * @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
  2234
     * @param condition any condition flag. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2235
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2236
    protected void csel(int size, Register dst, Register src1, Register src2, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2237
        conditionalSelectInstruction(CSEL, dst, src1, src2, condition, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2238
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2239
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2240
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2241
     * Conditional select negate. dst = src1 if condition else -src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2242
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2243
     * @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
  2244
     * @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
  2245
     * @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
  2246
     * @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
  2247
     * @param condition any condition flag. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2248
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2249
    protected void csneg(int size, Register dst, Register src1, Register src2, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2250
        conditionalSelectInstruction(CSNEG, dst, src1, src2, condition, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2251
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2252
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2253
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2254
     * Conditional increase. dst = src1 if condition else src2 + 1.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2255
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2256
     * @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
  2257
     * @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
  2258
     * @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
  2259
     * @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
  2260
     * @param condition any condition flag. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2261
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2262
    protected void csinc(int size, Register dst, Register src1, Register src2, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2263
        conditionalSelectInstruction(CSINC, dst, src1, src2, condition, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2264
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2265
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2266
    private void conditionalSelectInstruction(Instruction instr, Register dst, Register src1, Register src2, ConditionFlag condition, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2267
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2268
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2269
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2270
        emitInt(type.encoding | instr.encoding | ConditionalSelectOp | rd(dst) | rs1(src1) | rs2(src2) | condition.encoding << ConditionalConditionOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2271
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2272
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2273
    /* Integer Multiply/Divide (5.6) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2274
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2275
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2276
     * dst = src1 * src2 + src3.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2277
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2278
     * @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
  2279
     * @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
  2280
     * @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
  2281
     * @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
  2282
     * @param src3 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
  2283
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2284
    protected void madd(int size, Register dst, Register src1, Register src2, Register src3) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2285
        mulInstruction(MADD, dst, src1, src2, src3, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2286
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2287
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2288
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2289
     * dst = src3 - src1 * src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2290
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2291
     * @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
  2292
     * @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
  2293
     * @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
  2294
     * @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
  2295
     * @param src3 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
  2296
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2297
    protected void msub(int size, Register dst, Register src1, Register src2, Register src3) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2298
        mulInstruction(MSUB, dst, src1, src2, src3, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2299
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2300
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2301
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2302
     * Signed multiply high. dst = (src1 * src2)[127:64]
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2303
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2304
     * @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
  2305
     * @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
  2306
     * @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
  2307
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2308
    protected void smulh(Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2309
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2310
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2311
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2312
        emitInt(0b10011011010 << 21 | dst.encoding | rs1(src1) | rs2(src2) | 0b011111 << ImmediateOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2313
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2314
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2315
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2316
     * unsigned multiply high. dst = (src1 * src2)[127:64]
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2317
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2318
     * @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
  2319
     * @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
  2320
     * @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
  2321
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2322
    protected void umulh(Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2323
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2324
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2325
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2326
        emitInt(0b10011011110 << 21 | dst.encoding | rs1(src1) | rs2(src2) | 0b011111 << ImmediateOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2327
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2328
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2329
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2330
     * unsigned multiply add-long. xDst = xSrc3 + (wSrc1 * wSrc2)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2331
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2332
     * @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
  2333
     * @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
  2334
     * @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
  2335
     * @param src3 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
  2336
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2337
    protected void umaddl(Register dst, Register src1, Register src2, Register src3) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2338
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2339
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2340
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2341
        assert !src3.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2342
        emitInt(0b10011011101 << 21 | dst.encoding | rs1(src1) | rs2(src2) | 0b011111 << ImmediateOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2343
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2344
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2345
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2346
     * signed multiply add-long. xDst = xSrc3 + (wSrc1 * wSrc2)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2347
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2348
     * @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
  2349
     * @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
  2350
     * @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
  2351
     * @param src3 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
  2352
     */
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  2353
    public void smaddl(Register dst, Register src1, Register src2, Register src3) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2354
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2355
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2356
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2357
        assert !src3.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2358
        emitInt(0b10011011001 << 21 | dst.encoding | rs1(src1) | rs2(src2) | rs3(src3));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2359
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2360
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2361
    private void mulInstruction(Instruction instr, Register dst, Register src1, Register src2, Register src3, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2362
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2363
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2364
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2365
        assert !src3.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2366
        emitInt(type.encoding | instr.encoding | MulOp | rd(dst) | rs1(src1) | rs2(src2) | rs3(src3));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2367
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2368
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2369
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2370
     * Signed divide. dst = src1 / src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2371
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2372
     * @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
  2373
     * @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
  2374
     * @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
  2375
     * @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
  2376
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2377
    public void sdiv(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2378
        dataProcessing2SourceOp(SDIV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2379
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2380
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2381
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2382
     * Unsigned divide. dst = src1 / src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2383
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2384
     * @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
  2385
     * @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
  2386
     * @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
  2387
     * @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
  2388
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2389
    public void udiv(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2390
        dataProcessing2SourceOp(UDIV, dst, src1, src2, generalFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2391
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2392
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2393
    private void dataProcessing1SourceOp(Instruction instr, Register dst, Register src, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2394
        emitInt(type.encoding | instr.encoding | DataProcessing1SourceOp | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2395
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2396
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2397
    private void dataProcessing2SourceOp(Instruction instr, Register dst, Register src1, Register src2, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2398
        assert !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2399
        assert !src1.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2400
        assert !src2.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2401
        emitInt(type.encoding | instr.encoding | DataProcessing2SourceOp | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2402
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2403
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2404
    /* Floating point operations */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2405
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2406
    /* Load-Store Single FP register (5.7.1.1) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2407
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2408
     * Floating point load.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2409
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2410
     * @param size number of bits read from memory into rt. Must be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2411
     * @param rt floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2412
     * @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
  2413
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2414
    public void fldr(int size, Register rt, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2415
        assert rt.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2416
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2417
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2418
        loadStoreInstruction(LDR, rt, address, InstructionType.FP32, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2419
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2420
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2421
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2422
     * Floating point store.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2423
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2424
     * @param size number of bits read from memory into rt. Must be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2425
     * @param rt floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2426
     * @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
  2427
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2428
    public void fstr(int size, Register rt, AArch64Address address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2429
        assert rt.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2430
        assert size == 32 || size == 64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2431
        int transferSize = NumUtil.log2Ceil(size / 8);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2432
        loadStoreInstruction(STR, rt, address, InstructionType.FP64, transferSize);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2433
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2434
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2435
    /* Floating-point Move (register) (5.7.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2436
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2437
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2438
     * Floating point move.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2439
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2440
     * @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
  2441
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2442
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2443
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2444
    protected void fmov(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2445
        fpDataProcessing1Source(FMOV, dst, src, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2446
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2447
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2448
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2449
     * Move size bits from floating point register unchanged to general purpose register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2450
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2451
     * @param size number of bits read from memory into rt. Must be 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2452
     * @param dst general purpose register. May not be null, stack-pointer or zero-register
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2453
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2454
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2455
    protected void fmovFpu2Cpu(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2456
        assert dst.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2457
        assert src.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2458
        fmovCpuFpuInstruction(dst, src, size == 64, Instruction.FMOVFPU2CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2459
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2460
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2461
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2462
     * Move size bits from general purpose register unchanged to floating point register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2463
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2464
     * @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
  2465
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2466
     * @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
  2467
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2468
    protected void fmovCpu2Fpu(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2469
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2470
        assert src.getRegisterCategory().equals(CPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2471
        fmovCpuFpuInstruction(dst, src, size == 64, Instruction.FMOVCPU2FPU);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2472
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2473
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2474
    private void fmovCpuFpuInstruction(Register dst, Register src, boolean is64bit, Instruction instr) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2475
        int sf = is64bit ? FP64.encoding | General64.encoding : FP32.encoding | General32.encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2476
        emitInt(sf | instr.encoding | FpConvertOp | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2477
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2478
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2479
    /* Floating-point Move (immediate) (5.7.3) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2480
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2481
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2482
     * Move immediate into register.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2483
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2484
     * @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
  2485
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2486
     * @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
  2487
     *            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
  2488
     *            {@code isFloatImmediate}, respectively {@code #isDoubleImmediate} must be true
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2489
     *            depending on size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2490
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2491
    protected void fmov(int size, Register dst, double imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2492
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2493
        InstructionType type = floatFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2494
        int immEncoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2495
        if (type == FP64) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2496
            immEncoding = getDoubleImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2497
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2498
            assert imm == (float) imm : "float mov must use an immediate that can be represented using a float.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2499
            immEncoding = getFloatImmediate((float) imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2500
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2501
        emitInt(type.encoding | FMOV.encoding | FpImmOp | immEncoding | rd(dst));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2502
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2503
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2504
    private static int getDoubleImmediate(double imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2505
        assert isDoubleImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2506
        // bits: aBbb.bbbb.bbcd.efgh.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2507
        // 0000.0000.0000.0000.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2508
        long repr = Double.doubleToRawLongBits(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2509
        int a = (int) (repr >>> 63) << 7;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2510
        int b = (int) ((repr >>> 61) & 0x1) << 6;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2511
        int cToH = (int) (repr >>> 48) & 0x3f;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2512
        return (a | b | cToH) << FpImmOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2513
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2514
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2515
    protected static boolean isDoubleImmediate(double imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2516
        // Valid values will have the form:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2517
        // aBbb.bbbb.bbcd.efgh.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2518
        // 0000.0000.0000.0000.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2519
        long bits = Double.doubleToRawLongBits(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2520
        // lower 48 bits are cleared
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2521
        if ((bits & NumUtil.getNbitNumberLong(48)) != 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2522
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2523
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2524
        // bits[61..54] are all set or all cleared.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2525
        long pattern = (bits >> 54) & NumUtil.getNbitNumberLong(7);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2526
        if (pattern != 0 && pattern != NumUtil.getNbitNumberLong(7)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2527
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2528
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2529
        // bits[62] and bits[61] are opposites.
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2530
        boolean result = ((bits ^ (bits << 1)) & (1L << 62)) != 0;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2531
        return result;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2532
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2533
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2534
    private static int getFloatImmediate(float imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2535
        assert isFloatImmediate(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2536
        // bits: aBbb.bbbc.defg.h000.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2537
        int repr = Float.floatToRawIntBits(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2538
        int a = (repr >>> 31) << 7;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2539
        int b = ((repr >>> 29) & 0x1) << 6;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2540
        int cToH = (repr >>> 19) & NumUtil.getNbitNumberInt(6);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2541
        return (a | b | cToH) << FpImmOffset;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2542
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2543
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2544
    protected static boolean isFloatImmediate(float imm) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2545
        // Valid values will have the form:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2546
        // aBbb.bbbc.defg.h000.0000.0000.0000.0000
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2547
        int bits = Float.floatToRawIntBits(imm);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2548
        // lower 20 bits are cleared.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2549
        if ((bits & NumUtil.getNbitNumberInt(19)) != 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2550
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2551
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2552
        // bits[29..25] are all set or all cleared
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2553
        int pattern = (bits >> 25) & NumUtil.getNbitNumberInt(5);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2554
        if (pattern != 0 && pattern != NumUtil.getNbitNumberInt(5)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2555
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2556
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2557
        // bits[29] and bits[30] have to be opposite
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2558
        return ((bits ^ (bits << 1)) & (1 << 30)) != 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2559
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2560
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2561
    /* Convert Floating-point Precision (5.7.4.1) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2562
    /* Converts float to double and vice-versa */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2563
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2564
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2565
     * Convert float to double and vice-versa.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2566
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2567
     * @param srcSize size of source register in bits.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2568
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2569
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2570
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2571
    public void fcvt(int srcSize, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2572
        if (srcSize == 32) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2573
            fpDataProcessing1Source(FCVTDS, dst, src, floatFromSize(srcSize));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2574
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2575
            fpDataProcessing1Source(FCVTSD, dst, src, floatFromSize(srcSize));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2576
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2577
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2578
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2579
    /* Convert to Integer (5.7.4.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2580
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2581
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2582
     * Convert floating point to integer. Rounds towards zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2583
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2584
     * @param targetSize size of integer register. 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2585
     * @param srcSize size of floating point register. 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2586
     * @param dst general purpose register. May not be null, the zero-register or the stackpointer.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2587
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2588
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2589
    public void fcvtzs(int targetSize, int srcSize, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2590
        assert !dst.equals(zr) && !dst.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2591
        assert src.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2592
        fcvtCpuFpuInstruction(FCVTZS, dst, src, generalFromSize(targetSize), floatFromSize(srcSize));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2593
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2594
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2595
    /* Convert from Integer (5.7.4.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2596
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2597
     * Converts integer to floating point. Uses rounding mode defined by FCPR.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2598
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2599
     * @param targetSize size of floating point register. 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2600
     * @param srcSize size of integer register. 32 or 64.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2601
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2602
     * @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
  2603
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2604
    public void scvtf(int targetSize, int srcSize, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2605
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2606
        assert !src.equals(sp);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2607
        fcvtCpuFpuInstruction(SCVTF, dst, src, floatFromSize(targetSize), generalFromSize(srcSize));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2608
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2609
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2610
    private void fcvtCpuFpuInstruction(Instruction instr, Register dst, Register src, InstructionType type1, InstructionType type2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2611
        emitInt(type1.encoding | type2.encoding | instr.encoding | FpConvertOp | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2612
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2613
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2614
    /* Floating-point Round to Integral (5.7.5) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2615
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2616
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2617
     * Rounds floating-point to integral. Rounds towards zero.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2618
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2619
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2620
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2621
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2622
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2623
    protected void frintz(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2624
        fpDataProcessing1Source(FRINTZ, dst, src, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2625
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2626
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2627
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2628
     * Rounds floating-point to integral. Rounds towards nearest with ties to even.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2629
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2630
     * @param size register size.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2631
     * @param dst floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2632
     * @param src floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2633
     */
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2634
    public void frintn(int size, Register dst, Register src) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2635
        fpDataProcessing1Source(FRINTN, dst, src, floatFromSize(size));
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2636
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2637
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2638
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2639
     * Rounds floating-point to integral. Rounds towards minus infinity.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2640
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2641
     * @param size register size.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2642
     * @param dst floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2643
     * @param src floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2644
     */
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2645
    public void frintm(int size, Register dst, Register src) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2646
        fpDataProcessing1Source(FRINTM, dst, src, floatFromSize(size));
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2647
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2648
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2649
    /**
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2650
     * Rounds floating-point to integral. Rounds towards plus infinity.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2651
     *
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2652
     * @param size register size.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2653
     * @param dst floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2654
     * @param src floating point register. May not be null.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2655
     */
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2656
    public void frintp(int size, Register dst, Register src) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2657
        fpDataProcessing1Source(FRINTP, dst, src, floatFromSize(size));
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2658
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 50104
diff changeset
  2659
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2660
    /* Floating-point Arithmetic (1 source) (5.7.6) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2661
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2662
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2663
     * dst = |src|.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2664
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2665
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2666
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2667
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2668
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2669
    public void fabs(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2670
        fpDataProcessing1Source(FABS, dst, src, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2671
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2672
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2673
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2674
     * dst = -neg.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2675
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2676
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2677
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2678
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2679
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2680
    public void fneg(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2681
        fpDataProcessing1Source(FNEG, dst, src, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2682
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2683
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2684
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2685
     * dst = Sqrt(src).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2686
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2687
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2688
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2689
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2690
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2691
    public void fsqrt(int size, Register dst, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2692
        fpDataProcessing1Source(FSQRT, dst, src, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2693
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2694
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2695
    private void fpDataProcessing1Source(Instruction instr, Register dst, Register src, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2696
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2697
        assert src.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2698
        emitInt(type.encoding | instr.encoding | Fp1SourceOp | rd(dst) | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2699
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2700
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2701
    /* Floating-point Arithmetic (2 source) (5.7.7) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2702
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2703
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2704
     * dst = src1 + src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2705
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2706
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2707
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2708
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2709
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2710
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2711
    public void fadd(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2712
        fpDataProcessing2Source(FADD, dst, src1, src2, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2713
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2714
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2715
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2716
     * dst = src1 - src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2717
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2718
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2719
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2720
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2721
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2722
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2723
    public void fsub(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2724
        fpDataProcessing2Source(FSUB, dst, src1, src2, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2725
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2726
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2727
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2728
     * dst = src1 * src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2729
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2730
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2731
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2732
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2733
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2734
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2735
    public void fmul(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2736
        fpDataProcessing2Source(FMUL, dst, src1, src2, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2737
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2738
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2739
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2740
     * dst = src1 / src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2741
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2742
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2743
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2744
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2745
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2746
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2747
    public void fdiv(int size, Register dst, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2748
        fpDataProcessing2Source(FDIV, dst, src1, src2, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2749
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2750
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2751
    private void fpDataProcessing2Source(Instruction instr, Register dst, Register src1, Register src2, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2752
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2753
        assert src1.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2754
        assert src2.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2755
        emitInt(type.encoding | instr.encoding | Fp2SourceOp | rd(dst) | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2756
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2757
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2758
    /* Floating-point Multiply-Add (5.7.9) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2759
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2760
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2761
     * dst = src1 * src2 + src3.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2762
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2763
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2764
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2765
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2766
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2767
     * @param src3 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2768
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2769
    protected void fmadd(int size, Register dst, Register src1, Register src2, Register src3) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2770
        fpDataProcessing3Source(FMADD, dst, src1, src2, src3, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2771
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2772
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2773
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2774
     * dst = src3 - src1 * src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2775
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2776
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2777
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2778
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2779
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2780
     * @param src3 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2781
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2782
    protected void fmsub(int size, Register dst, Register src1, Register src2, Register src3) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2783
        fpDataProcessing3Source(FMSUB, dst, src1, src2, src3, floatFromSize(size));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2784
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2785
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2786
    private void fpDataProcessing3Source(Instruction instr, Register dst, Register src1, Register src2, Register src3, InstructionType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2787
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2788
        assert src1.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2789
        assert src2.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2790
        assert src3.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2791
        emitInt(type.encoding | instr.encoding | Fp3SourceOp | rd(dst) | rs1(src1) | rs2(src2) | rs3(src3));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2792
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2793
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2794
    /* Floating-point Comparison (5.7.10) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2795
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2796
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2797
     * Compares src1 to src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2798
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2799
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2800
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2801
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2802
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2803
    public void fcmp(int size, Register src1, Register src2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2804
        assert src1.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2805
        assert src2.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2806
        InstructionType type = floatFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2807
        emitInt(type.encoding | FCMP.encoding | FpCmpOp | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2808
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2809
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2810
    /**
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2811
     * Signalling compares src1 to src2.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2812
     *
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2813
     * @param size register size.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2814
     * @param src1 floating point register. May not be null.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2815
     * @param src2 floating point register. May not be null.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2816
     */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2817
    public void fcmpe(int size, Register src1, Register src2) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2818
        assert src1.getRegisterCategory().equals(SIMD);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2819
        assert src2.getRegisterCategory().equals(SIMD);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2820
        InstructionType type = floatFromSize(size);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2821
        emitInt(type.encoding | FCMP.encoding | FpCmpeOp | rs1(src1) | rs2(src2));
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2822
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2823
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2824
    /**
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2825
     * Conditional compare. NZCV = fcmp(src1, src2) if condition else uimm4.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2826
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2827
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2828
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2829
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2830
     * @param uimm4 condition flags that are used if condition is false.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2831
     * @param condition every condition allowed. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2832
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2833
    public void fccmp(int size, Register src1, Register src2, int uimm4, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2834
        assert NumUtil.isUnsignedNbit(4, uimm4);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2835
        assert src1.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2836
        assert src2.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2837
        InstructionType type = floatFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2838
        emitInt(type.encoding | FCCMP.encoding | uimm4 | condition.encoding << ConditionalConditionOffset | rs1(src1) | rs2(src2));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2839
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2840
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2841
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2842
     * Compare register to 0.0 .
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2843
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2844
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2845
     * @param src floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2846
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2847
    public void fcmpZero(int size, Register src) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2848
        assert src.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2849
        InstructionType type = floatFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2850
        emitInt(type.encoding | FCMPZERO.encoding | FpCmpOp | rs1(src));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2851
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2852
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2853
    /**
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2854
     * Signalling compare register to 0.0 .
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2855
     *
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2856
     * @param size register size.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2857
     * @param src floating point register. May not be null.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2858
     */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2859
    public void fcmpeZero(int size, Register src) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2860
        assert src.getRegisterCategory().equals(SIMD);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2861
        InstructionType type = floatFromSize(size);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2862
        emitInt(type.encoding | FCMPZERO.encoding | FpCmpeOp | rs1(src));
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2863
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2864
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2865
    /* Floating-point Conditional Select (5.7.11) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2866
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2867
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2868
     * Conditional select. dst = src1 if condition else src2.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2869
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2870
     * @param size register size.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2871
     * @param dst floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2872
     * @param src1 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2873
     * @param src2 floating point register. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2874
     * @param condition every condition allowed. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2875
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2876
    protected void fcsel(int size, Register dst, Register src1, Register src2, ConditionFlag condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2877
        assert dst.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2878
        assert src1.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2879
        assert src2.getRegisterCategory().equals(SIMD);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2880
        InstructionType type = floatFromSize(size);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2881
        emitInt(type.encoding | FCSEL.encoding | rd(dst) | rs1(src1) | rs2(src2) | condition.encoding << ConditionalConditionOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2882
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2883
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2884
    /* Debug exceptions (5.9.1.2) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2885
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2886
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2887
     * 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
  2888
     * UNALLOCATED instruction.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2889
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2890
     * @param uimm16 Arbitrary 16-bit unsigned payload.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2891
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2892
    protected void hlt(int uimm16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2893
        exceptionInstruction(HLT, uimm16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2894
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2895
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2896
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2897
     * 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
  2898
     * exception level.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2899
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2900
     * @param uimm16 Arbitrary 16-bit unsigned payload.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2901
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2902
    protected void brk(int uimm16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2903
        exceptionInstruction(BRK, uimm16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2904
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2905
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2906
    private void exceptionInstruction(Instruction instr, int uimm16) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2907
        assert NumUtil.isUnsignedNbit(16, uimm16);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2908
        emitInt(instr.encoding | ExceptionOp | uimm16 << SystemImmediateOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2909
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2910
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2911
    /* Architectural hints (5.9.4) */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2912
    public enum SystemHint {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2913
        NOP(0x0),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2914
        YIELD(0x1),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2915
        WFE(0x2),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2916
        WFI(0x3),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2917
        SEV(0x4),
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  2918
        SEVL(0x5),
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
  2919
        CSDB(0x14);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2920
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2921
        private final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2922
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2923
        SystemHint(int encoding) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2924
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2925
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2926
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2927
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2928
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2929
     * Architectural hints.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2930
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2931
     * @param hint Can be any of the defined hints. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2932
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2933
    protected void hint(SystemHint hint) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2934
        emitInt(HINT.encoding | hint.encoding << SystemImmediateOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2935
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2936
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2937
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2938
     * Clear Exclusive: clears the local record of the executing processor that an address has had a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2939
     * request for an exclusive access.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2940
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2941
    protected void clrex() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2942
        emitInt(CLREX.encoding);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2943
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2944
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2945
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2946
     * Possible barrier definitions for Aarch64. LOAD_LOAD and LOAD_STORE map to the same underlying
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2947
     * barrier.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2948
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2949
     * We only need synchronization across the inner shareable domain (see B2-90 in the Reference
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2950
     * documentation).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2951
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2952
    public enum BarrierKind {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2953
        LOAD_LOAD(0x9, "ISHLD"),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2954
        LOAD_STORE(0x9, "ISHLD"),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2955
        STORE_STORE(0xA, "ISHST"),
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2956
        ANY_ANY(0xB, "ISH");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2957
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2958
        public final int encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2959
        public final String optionName;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2960
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2961
        BarrierKind(int encoding, String optionName) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2962
            this.encoding = encoding;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2963
            this.optionName = optionName;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2964
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2965
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2966
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2967
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2968
     * Data Memory Barrier.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2969
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2970
     * @param barrierKind barrier that is issued. May not be null.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2971
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2972
    public void dmb(BarrierKind barrierKind) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2973
        emitInt(DMB.encoding | BarrierOp | barrierKind.encoding << BarrierKindOffset);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2974
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  2975
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2976
    public void mrs(Register dst, SystemRegister systemRegister) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2977
        emitInt(MRS.encoding | systemRegister.encoding() | rt(dst));
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2978
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2979
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2980
    public void msr(SystemRegister systemRegister, Register src) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2981
        emitInt(MRS.encoding | systemRegister.encoding() | rt(src));
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2982
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2983
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  2984
    public void dc(DataCacheOperationType type, Register src) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  2985
        emitInt(DC.encoding | type.encoding() | rt(src));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  2986
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 55509
diff changeset
  2987
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2988
    public void annotatePatchingImmediate(int pos, Instruction instruction, int operandSizeBits, int offsetBits, int shift) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2989
        if (codePatchingAnnotationConsumer != null) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  2990
            codePatchingAnnotationConsumer.accept(new SingleInstructionAnnotation(pos, instruction, operandSizeBits, offsetBits, shift));
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2991
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2992
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2993
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  2994
    void annotateImmediateMovSequence(int pos, int numInstrs) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2995
        if (codePatchingAnnotationConsumer != null) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  2996
            codePatchingAnnotationConsumer.accept(new MovSequenceAnnotation(pos, numInstrs));
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2997
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2998
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  2999
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  3000
    public static class SingleInstructionAnnotation extends CodeAnnotation {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3001
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3002
        /**
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3003
         * The size of the operand, in bytes.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3004
         */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3005
        public final int operandSizeBits;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3006
        public final int offsetBits;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3007
        public final Instruction instruction;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3008
        public final int shift;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3009
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  3010
        SingleInstructionAnnotation(int instructionPosition, Instruction instruction, int operandSizeBits, int offsetBits, int shift) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3011
            super(instructionPosition);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3012
            this.operandSizeBits = operandSizeBits;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3013
            this.offsetBits = offsetBits;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3014
            this.shift = shift;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3015
            this.instruction = instruction;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3016
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3017
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3018
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3019
    public static class MovSequenceAnnotation extends CodeAnnotation {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3020
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3021
        /**
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3022
         * The size of the operand, in bytes.
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3023
         */
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3024
        public final int numInstrs;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3025
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  3026
        MovSequenceAnnotation(int instructionPosition, int numInstrs) {
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3027
            super(instructionPosition);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3028
            this.numInstrs = numInstrs;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3029
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3030
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 54084
diff changeset
  3031
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3032
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3033
     * dst[0...n] = countBitCountOfEachByte(src[0...n]), n = size/8.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3034
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3035
     * @param size register size. Has to be 64 or 128.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3036
     * @param dst SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3037
     * @param src SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3038
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3039
    public void cnt(int size, Register dst, Register src) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3040
        assert 64 == size || 128 == size : "Invalid size for cnt";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3041
        emitInt((size >> 7) << SIMDQBitOffset | CNT.encoding | rd(dst) | rs1(src));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3042
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3043
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3044
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3045
     * dst = src[0] + ....+ src[n].
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3046
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3047
     * @param size register size. Has to be 64 or 128.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3048
     * @param laneWidth the width that SIMD register is treated as different lanes with.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3049
     * @param dst SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3050
     * @param src SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3051
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3052
    public void addv(int size, SIMDElementSize laneWidth, Register dst, Register src) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3053
        assert 64 == size || 128 == size : "Invalid size for addv";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3054
        assert SIMDElementSize.DoubleWord != laneWidth : "Invalid lane width for addv";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3055
        assert 64 != size || SIMDElementSize.Word != laneWidth : "Invalid size and lane combination for addv";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3056
        emitInt((size >> 7) << SIMDQBitOffset | laneWidth.encoding << SIMDSizeOffset | ADDV.encoding | rd(dst) | rs1(src));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3057
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3058
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3059
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3060
     * dst = src[srcIdx].
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3061
     *
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3062
     * @param size register size. Can be 8, 16, 32 or 64.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3063
     * @param dst general purpose register. Should not be null or zero-register.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3064
     * @param srcIdx lane index of source register that dest data is from.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3065
     * @param src SIMD register. Should not be null.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3066
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3067
    public void umov(int size, Register dst, int srcIdx, Register src) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3068
        assert (srcIdx + 1) * size <= 128 : "Invalid src vectRegister index";
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3069
        InstructionType simdDataType = simdFromSize(size);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3070
        int imm5 = simdDataType.encoding | srcIdx << Integer.numberOfTrailingZeros(simdDataType.encoding) + 1;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3071
        emitInt((size >> 6) << SIMDQBitOffset | imm5 << SIMDImm5Offset | UMOV.encoding | rd(dst) | rs1(src));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54328
diff changeset
  3072
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  3073
}