src/cpu/x86/vm/x86.ad

Tue, 25 Mar 2014 12:54:21 -0700

author
goetz
date
Tue, 25 Mar 2014 12:54:21 -0700
changeset 6517
a433eb716ce1
parent 6312
04d32e7fad07
child 6876
710a3c8b516e
child 7854
e8260b6328fb
permissions
-rw-r--r--

8037821: Account for trampoline stubs when estimating code buffer sizes
Summary: Take into account space needed for "trampoline code" used by calls on PPC64.
Reviewed-by: kvn
Contributed-by: lutz.schmidt@sap.com

kvn@3390 1 //
kvn@3577 2 // Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
kvn@3390 3 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
kvn@3390 4 //
kvn@3390 5 // This code is free software; you can redistribute it and/or modify it
kvn@3390 6 // under the terms of the GNU General Public License version 2 only, as
kvn@3390 7 // published by the Free Software Foundation.
kvn@3390 8 //
kvn@3390 9 // This code is distributed in the hope that it will be useful, but WITHOUT
kvn@3390 10 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
kvn@3390 11 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kvn@3390 12 // version 2 for more details (a copy is included in the LICENSE file that
kvn@3390 13 // accompanied this code).
kvn@3390 14 //
kvn@3390 15 // You should have received a copy of the GNU General Public License version
kvn@3390 16 // 2 along with this work; if not, write to the Free Software Foundation,
kvn@3390 17 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
kvn@3390 18 //
kvn@3390 19 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
kvn@3390 20 // or visit www.oracle.com if you need additional information or have any
kvn@3390 21 // questions.
kvn@3390 22 //
kvn@3390 23 //
kvn@3390 24
kvn@3390 25 // X86 Common Architecture Description File
kvn@3390 26
kvn@3882 27 //----------REGISTER DEFINITION BLOCK------------------------------------------
kvn@3882 28 // This information is used by the matcher and the register allocator to
kvn@3882 29 // describe individual registers and classes of registers within the target
kvn@3882 30 // archtecture.
kvn@3882 31
kvn@3882 32 register %{
kvn@3882 33 //----------Architecture Description Register Definitions----------------------
kvn@3882 34 // General Registers
kvn@3882 35 // "reg_def" name ( register save type, C convention save type,
kvn@3882 36 // ideal register type, encoding );
kvn@3882 37 // Register Save Types:
kvn@3882 38 //
kvn@3882 39 // NS = No-Save: The register allocator assumes that these registers
kvn@3882 40 // can be used without saving upon entry to the method, &
kvn@3882 41 // that they do not need to be saved at call sites.
kvn@3882 42 //
kvn@3882 43 // SOC = Save-On-Call: The register allocator assumes that these registers
kvn@3882 44 // can be used without saving upon entry to the method,
kvn@3882 45 // but that they must be saved at call sites.
kvn@3882 46 //
kvn@3882 47 // SOE = Save-On-Entry: The register allocator assumes that these registers
kvn@3882 48 // must be saved before using them upon entry to the
kvn@3882 49 // method, but they do not need to be saved at call
kvn@3882 50 // sites.
kvn@3882 51 //
kvn@3882 52 // AS = Always-Save: The register allocator assumes that these registers
kvn@3882 53 // must be saved before using them upon entry to the
kvn@3882 54 // method, & that they must be saved at call sites.
kvn@3882 55 //
kvn@3882 56 // Ideal Register Type is used to determine how to save & restore a
kvn@3882 57 // register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
kvn@3882 58 // spilled with LoadP/StoreP. If the register supports both, use Op_RegI.
kvn@3882 59 //
kvn@3882 60 // The encoding number is the actual bit-pattern placed into the opcodes.
kvn@3882 61
kvn@3882 62 // XMM registers. 256-bit registers or 8 words each, labeled (a)-h.
kvn@3882 63 // Word a in each register holds a Float, words ab hold a Double.
kvn@3882 64 // The whole registers are used in SSE4.2 version intrinsics,
kvn@3882 65 // array copy stubs and superword operations (see UseSSE42Intrinsics,
kvn@3882 66 // UseXMMForArrayCopy and UseSuperword flags).
kvn@3882 67 // XMM8-XMM15 must be encoded with REX (VEX for UseAVX).
kvn@3882 68 // Linux ABI: No register preserved across function calls
kvn@3882 69 // XMM0-XMM7 might hold parameters
kvn@3882 70 // Windows ABI: XMM6-XMM15 preserved across function calls
kvn@3882 71 // XMM0-XMM3 might hold parameters
kvn@3882 72
kvn@3882 73 reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
kvn@3929 74 reg_def XMM0b( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(1));
kvn@3929 75 reg_def XMM0c( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(2));
kvn@3929 76 reg_def XMM0d( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(3));
kvn@3929 77 reg_def XMM0e( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(4));
kvn@3929 78 reg_def XMM0f( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(5));
kvn@3929 79 reg_def XMM0g( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(6));
kvn@3929 80 reg_def XMM0h( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg()->next(7));
kvn@3882 81
kvn@3882 82 reg_def XMM1 ( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg());
kvn@3929 83 reg_def XMM1b( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(1));
kvn@3929 84 reg_def XMM1c( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(2));
kvn@3929 85 reg_def XMM1d( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(3));
kvn@3929 86 reg_def XMM1e( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(4));
kvn@3929 87 reg_def XMM1f( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(5));
kvn@3929 88 reg_def XMM1g( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(6));
kvn@3929 89 reg_def XMM1h( SOC, SOC, Op_RegF, 1, xmm1->as_VMReg()->next(7));
kvn@3882 90
kvn@3882 91 reg_def XMM2 ( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg());
kvn@3929 92 reg_def XMM2b( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(1));
kvn@3929 93 reg_def XMM2c( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(2));
kvn@3929 94 reg_def XMM2d( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(3));
kvn@3929 95 reg_def XMM2e( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(4));
kvn@3929 96 reg_def XMM2f( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(5));
kvn@3929 97 reg_def XMM2g( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(6));
kvn@3929 98 reg_def XMM2h( SOC, SOC, Op_RegF, 2, xmm2->as_VMReg()->next(7));
kvn@3882 99
kvn@3882 100 reg_def XMM3 ( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg());
kvn@3929 101 reg_def XMM3b( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(1));
kvn@3929 102 reg_def XMM3c( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(2));
kvn@3929 103 reg_def XMM3d( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(3));
kvn@3929 104 reg_def XMM3e( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(4));
kvn@3929 105 reg_def XMM3f( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(5));
kvn@3929 106 reg_def XMM3g( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(6));
kvn@3929 107 reg_def XMM3h( SOC, SOC, Op_RegF, 3, xmm3->as_VMReg()->next(7));
kvn@3882 108
kvn@3882 109 reg_def XMM4 ( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg());
kvn@3929 110 reg_def XMM4b( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(1));
kvn@3929 111 reg_def XMM4c( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(2));
kvn@3929 112 reg_def XMM4d( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(3));
kvn@3929 113 reg_def XMM4e( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(4));
kvn@3929 114 reg_def XMM4f( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(5));
kvn@3929 115 reg_def XMM4g( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(6));
kvn@3929 116 reg_def XMM4h( SOC, SOC, Op_RegF, 4, xmm4->as_VMReg()->next(7));
kvn@3882 117
kvn@3882 118 reg_def XMM5 ( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg());
kvn@3929 119 reg_def XMM5b( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(1));
kvn@3929 120 reg_def XMM5c( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(2));
kvn@3929 121 reg_def XMM5d( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(3));
kvn@3929 122 reg_def XMM5e( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(4));
kvn@3929 123 reg_def XMM5f( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(5));
kvn@3929 124 reg_def XMM5g( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(6));
kvn@3929 125 reg_def XMM5h( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(7));
kvn@3882 126
kvn@3882 127 #ifdef _WIN64
kvn@3882 128
kvn@3882 129 reg_def XMM6 ( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg());
kvn@3929 130 reg_def XMM6b( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(1));
kvn@3929 131 reg_def XMM6c( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(2));
kvn@3929 132 reg_def XMM6d( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(3));
kvn@3929 133 reg_def XMM6e( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(4));
kvn@3929 134 reg_def XMM6f( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(5));
kvn@3929 135 reg_def XMM6g( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(6));
kvn@3929 136 reg_def XMM6h( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(7));
kvn@3882 137
kvn@3882 138 reg_def XMM7 ( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg());
kvn@3929 139 reg_def XMM7b( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(1));
kvn@3929 140 reg_def XMM7c( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(2));
kvn@3929 141 reg_def XMM7d( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(3));
kvn@3929 142 reg_def XMM7e( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(4));
kvn@3929 143 reg_def XMM7f( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(5));
kvn@3929 144 reg_def XMM7g( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(6));
kvn@3929 145 reg_def XMM7h( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(7));
kvn@3882 146
kvn@3882 147 reg_def XMM8 ( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg());
kvn@3929 148 reg_def XMM8b( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(1));
kvn@3929 149 reg_def XMM8c( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(2));
kvn@3929 150 reg_def XMM8d( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(3));
kvn@3929 151 reg_def XMM8e( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(4));
kvn@3929 152 reg_def XMM8f( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(5));
kvn@3929 153 reg_def XMM8g( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(6));
kvn@3929 154 reg_def XMM8h( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(7));
kvn@3882 155
kvn@3882 156 reg_def XMM9 ( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg());
kvn@3929 157 reg_def XMM9b( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(1));
kvn@3929 158 reg_def XMM9c( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(2));
kvn@3929 159 reg_def XMM9d( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(3));
kvn@3929 160 reg_def XMM9e( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(4));
kvn@3929 161 reg_def XMM9f( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(5));
kvn@3929 162 reg_def XMM9g( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(6));
kvn@3929 163 reg_def XMM9h( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(7));
kvn@3882 164
kvn@3882 165 reg_def XMM10 ( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
kvn@3929 166 reg_def XMM10b( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(1));
kvn@3929 167 reg_def XMM10c( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(2));
kvn@3929 168 reg_def XMM10d( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(3));
kvn@3929 169 reg_def XMM10e( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(4));
kvn@3929 170 reg_def XMM10f( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(5));
kvn@3929 171 reg_def XMM10g( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(6));
kvn@3929 172 reg_def XMM10h( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(7));
kvn@3882 173
kvn@3882 174 reg_def XMM11 ( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
kvn@3929 175 reg_def XMM11b( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(1));
kvn@3929 176 reg_def XMM11c( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(2));
kvn@3929 177 reg_def XMM11d( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(3));
kvn@3929 178 reg_def XMM11e( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(4));
kvn@3929 179 reg_def XMM11f( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(5));
kvn@3929 180 reg_def XMM11g( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(6));
kvn@3929 181 reg_def XMM11h( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(7));
kvn@3882 182
kvn@3882 183 reg_def XMM12 ( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
kvn@3929 184 reg_def XMM12b( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(1));
kvn@3929 185 reg_def XMM12c( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(2));
kvn@3929 186 reg_def XMM12d( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(3));
kvn@3929 187 reg_def XMM12e( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(4));
kvn@3929 188 reg_def XMM12f( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(5));
kvn@3929 189 reg_def XMM12g( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(6));
kvn@3929 190 reg_def XMM12h( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(7));
kvn@3882 191
kvn@3882 192 reg_def XMM13 ( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
kvn@3929 193 reg_def XMM13b( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(1));
kvn@3929 194 reg_def XMM13c( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(2));
kvn@3929 195 reg_def XMM13d( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(3));
kvn@3929 196 reg_def XMM13e( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(4));
kvn@3929 197 reg_def XMM13f( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(5));
kvn@3929 198 reg_def XMM13g( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(6));
kvn@3929 199 reg_def XMM13h( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(7));
kvn@3882 200
kvn@3882 201 reg_def XMM14 ( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
kvn@3929 202 reg_def XMM14b( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(1));
kvn@3929 203 reg_def XMM14c( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(2));
kvn@3929 204 reg_def XMM14d( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(3));
kvn@3929 205 reg_def XMM14e( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(4));
kvn@3929 206 reg_def XMM14f( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(5));
kvn@3929 207 reg_def XMM14g( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(6));
kvn@3929 208 reg_def XMM14h( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(7));
kvn@3882 209
kvn@3882 210 reg_def XMM15 ( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
kvn@3929 211 reg_def XMM15b( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(1));
kvn@3929 212 reg_def XMM15c( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(2));
kvn@3929 213 reg_def XMM15d( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(3));
kvn@3929 214 reg_def XMM15e( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(4));
kvn@3929 215 reg_def XMM15f( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(5));
kvn@3929 216 reg_def XMM15g( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(6));
kvn@3929 217 reg_def XMM15h( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(7));
kvn@3882 218
kvn@3882 219 #else // _WIN64
kvn@3882 220
kvn@3882 221 reg_def XMM6 ( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
kvn@3929 222 reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(1));
kvn@3929 223 reg_def XMM6c( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(2));
kvn@3929 224 reg_def XMM6d( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(3));
kvn@3929 225 reg_def XMM6e( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(4));
kvn@3929 226 reg_def XMM6f( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(5));
kvn@3929 227 reg_def XMM6g( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(6));
kvn@3929 228 reg_def XMM6h( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(7));
kvn@3882 229
kvn@3882 230 reg_def XMM7 ( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg());
kvn@3929 231 reg_def XMM7b( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(1));
kvn@3929 232 reg_def XMM7c( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(2));
kvn@3929 233 reg_def XMM7d( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(3));
kvn@3929 234 reg_def XMM7e( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(4));
kvn@3929 235 reg_def XMM7f( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(5));
kvn@3929 236 reg_def XMM7g( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(6));
kvn@3929 237 reg_def XMM7h( SOC, SOC, Op_RegF, 7, xmm7->as_VMReg()->next(7));
kvn@3882 238
kvn@3882 239 #ifdef _LP64
kvn@3882 240
kvn@3882 241 reg_def XMM8 ( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg());
kvn@3929 242 reg_def XMM8b( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(1));
kvn@3929 243 reg_def XMM8c( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(2));
kvn@3929 244 reg_def XMM8d( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(3));
kvn@3929 245 reg_def XMM8e( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(4));
kvn@3929 246 reg_def XMM8f( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(5));
kvn@3929 247 reg_def XMM8g( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(6));
kvn@3929 248 reg_def XMM8h( SOC, SOC, Op_RegF, 8, xmm8->as_VMReg()->next(7));
kvn@3882 249
kvn@3882 250 reg_def XMM9 ( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg());
kvn@3929 251 reg_def XMM9b( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(1));
kvn@3929 252 reg_def XMM9c( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(2));
kvn@3929 253 reg_def XMM9d( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(3));
kvn@3929 254 reg_def XMM9e( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(4));
kvn@3929 255 reg_def XMM9f( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(5));
kvn@3929 256 reg_def XMM9g( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(6));
kvn@3929 257 reg_def XMM9h( SOC, SOC, Op_RegF, 9, xmm9->as_VMReg()->next(7));
kvn@3882 258
kvn@3882 259 reg_def XMM10 ( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg());
kvn@3929 260 reg_def XMM10b( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(1));
kvn@3929 261 reg_def XMM10c( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(2));
kvn@3929 262 reg_def XMM10d( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(3));
kvn@3929 263 reg_def XMM10e( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(4));
kvn@3929 264 reg_def XMM10f( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(5));
kvn@3929 265 reg_def XMM10g( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(6));
kvn@3929 266 reg_def XMM10h( SOC, SOC, Op_RegF, 10, xmm10->as_VMReg()->next(7));
kvn@3882 267
kvn@3882 268 reg_def XMM11 ( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg());
kvn@3929 269 reg_def XMM11b( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(1));
kvn@3929 270 reg_def XMM11c( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(2));
kvn@3929 271 reg_def XMM11d( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(3));
kvn@3929 272 reg_def XMM11e( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(4));
kvn@3929 273 reg_def XMM11f( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(5));
kvn@3929 274 reg_def XMM11g( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(6));
kvn@3929 275 reg_def XMM11h( SOC, SOC, Op_RegF, 11, xmm11->as_VMReg()->next(7));
kvn@3882 276
kvn@3882 277 reg_def XMM12 ( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg());
kvn@3929 278 reg_def XMM12b( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(1));
kvn@3929 279 reg_def XMM12c( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(2));
kvn@3929 280 reg_def XMM12d( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(3));
kvn@3929 281 reg_def XMM12e( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(4));
kvn@3929 282 reg_def XMM12f( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(5));
kvn@3929 283 reg_def XMM12g( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(6));
kvn@3929 284 reg_def XMM12h( SOC, SOC, Op_RegF, 12, xmm12->as_VMReg()->next(7));
kvn@3882 285
kvn@3882 286 reg_def XMM13 ( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg());
kvn@3929 287 reg_def XMM13b( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(1));
kvn@3929 288 reg_def XMM13c( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(2));
kvn@3929 289 reg_def XMM13d( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(3));
kvn@3929 290 reg_def XMM13e( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(4));
kvn@3929 291 reg_def XMM13f( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(5));
kvn@3929 292 reg_def XMM13g( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(6));
kvn@3929 293 reg_def XMM13h( SOC, SOC, Op_RegF, 13, xmm13->as_VMReg()->next(7));
kvn@3882 294
kvn@3882 295 reg_def XMM14 ( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg());
kvn@3929 296 reg_def XMM14b( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(1));
kvn@3929 297 reg_def XMM14c( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(2));
kvn@3929 298 reg_def XMM14d( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(3));
kvn@3929 299 reg_def XMM14e( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(4));
kvn@3929 300 reg_def XMM14f( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(5));
kvn@3929 301 reg_def XMM14g( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(6));
kvn@3929 302 reg_def XMM14h( SOC, SOC, Op_RegF, 14, xmm14->as_VMReg()->next(7));
kvn@3882 303
kvn@3882 304 reg_def XMM15 ( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg());
kvn@3929 305 reg_def XMM15b( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(1));
kvn@3929 306 reg_def XMM15c( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(2));
kvn@3929 307 reg_def XMM15d( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(3));
kvn@3929 308 reg_def XMM15e( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(4));
kvn@3929 309 reg_def XMM15f( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(5));
kvn@3929 310 reg_def XMM15g( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(6));
kvn@3929 311 reg_def XMM15h( SOC, SOC, Op_RegF, 15, xmm15->as_VMReg()->next(7));
kvn@3882 312
kvn@3882 313 #endif // _LP64
kvn@3882 314
kvn@3882 315 #endif // _WIN64
kvn@3882 316
kvn@3882 317 #ifdef _LP64
kvn@3882 318 reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
kvn@3882 319 #else
kvn@3882 320 reg_def RFLAGS(SOC, SOC, 0, 8, VMRegImpl::Bad());
kvn@3882 321 #endif // _LP64
kvn@3882 322
kvn@3882 323 alloc_class chunk1(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h,
kvn@3882 324 XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h,
kvn@3882 325 XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h,
kvn@3882 326 XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h,
kvn@3882 327 XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h,
kvn@3882 328 XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h,
kvn@3882 329 XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h,
kvn@3882 330 XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h
kvn@3882 331 #ifdef _LP64
kvn@3882 332 ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h,
kvn@3882 333 XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h,
kvn@3882 334 XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
kvn@3882 335 XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
kvn@3882 336 XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
kvn@3882 337 XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
kvn@3882 338 XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
kvn@3882 339 XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
kvn@3882 340 #endif
kvn@3882 341 );
kvn@3882 342
kvn@3882 343 // flags allocation class should be last.
kvn@3882 344 alloc_class chunk2(RFLAGS);
kvn@3882 345
kvn@3882 346 // Singleton class for condition codes
kvn@3882 347 reg_class int_flags(RFLAGS);
kvn@3882 348
kvn@3882 349 // Class for all float registers
kvn@3882 350 reg_class float_reg(XMM0,
kvn@3882 351 XMM1,
kvn@3882 352 XMM2,
kvn@3882 353 XMM3,
kvn@3882 354 XMM4,
kvn@3882 355 XMM5,
kvn@3882 356 XMM6,
kvn@3882 357 XMM7
kvn@3882 358 #ifdef _LP64
kvn@3882 359 ,XMM8,
kvn@3882 360 XMM9,
kvn@3882 361 XMM10,
kvn@3882 362 XMM11,
kvn@3882 363 XMM12,
kvn@3882 364 XMM13,
kvn@3882 365 XMM14,
kvn@3882 366 XMM15
kvn@3882 367 #endif
kvn@3882 368 );
kvn@3882 369
kvn@3882 370 // Class for all double registers
kvn@3882 371 reg_class double_reg(XMM0, XMM0b,
kvn@3882 372 XMM1, XMM1b,
kvn@3882 373 XMM2, XMM2b,
kvn@3882 374 XMM3, XMM3b,
kvn@3882 375 XMM4, XMM4b,
kvn@3882 376 XMM5, XMM5b,
kvn@3882 377 XMM6, XMM6b,
kvn@3882 378 XMM7, XMM7b
kvn@3882 379 #ifdef _LP64
kvn@3882 380 ,XMM8, XMM8b,
kvn@3882 381 XMM9, XMM9b,
kvn@3882 382 XMM10, XMM10b,
kvn@3882 383 XMM11, XMM11b,
kvn@3882 384 XMM12, XMM12b,
kvn@3882 385 XMM13, XMM13b,
kvn@3882 386 XMM14, XMM14b,
kvn@3882 387 XMM15, XMM15b
kvn@3882 388 #endif
kvn@3882 389 );
kvn@3882 390
kvn@3882 391 // Class for all 32bit vector registers
kvn@3882 392 reg_class vectors_reg(XMM0,
kvn@3882 393 XMM1,
kvn@3882 394 XMM2,
kvn@3882 395 XMM3,
kvn@3882 396 XMM4,
kvn@3882 397 XMM5,
kvn@3882 398 XMM6,
kvn@3882 399 XMM7
kvn@3882 400 #ifdef _LP64
kvn@3882 401 ,XMM8,
kvn@3882 402 XMM9,
kvn@3882 403 XMM10,
kvn@3882 404 XMM11,
kvn@3882 405 XMM12,
kvn@3882 406 XMM13,
kvn@3882 407 XMM14,
kvn@3882 408 XMM15
kvn@3882 409 #endif
kvn@3882 410 );
kvn@3882 411
kvn@3882 412 // Class for all 64bit vector registers
kvn@3882 413 reg_class vectord_reg(XMM0, XMM0b,
kvn@3882 414 XMM1, XMM1b,
kvn@3882 415 XMM2, XMM2b,
kvn@3882 416 XMM3, XMM3b,
kvn@3882 417 XMM4, XMM4b,
kvn@3882 418 XMM5, XMM5b,
kvn@3882 419 XMM6, XMM6b,
kvn@3882 420 XMM7, XMM7b
kvn@3882 421 #ifdef _LP64
kvn@3882 422 ,XMM8, XMM8b,
kvn@3882 423 XMM9, XMM9b,
kvn@3882 424 XMM10, XMM10b,
kvn@3882 425 XMM11, XMM11b,
kvn@3882 426 XMM12, XMM12b,
kvn@3882 427 XMM13, XMM13b,
kvn@3882 428 XMM14, XMM14b,
kvn@3882 429 XMM15, XMM15b
kvn@3882 430 #endif
kvn@3882 431 );
kvn@3882 432
kvn@3882 433 // Class for all 128bit vector registers
kvn@3882 434 reg_class vectorx_reg(XMM0, XMM0b, XMM0c, XMM0d,
kvn@3882 435 XMM1, XMM1b, XMM1c, XMM1d,
kvn@3882 436 XMM2, XMM2b, XMM2c, XMM2d,
kvn@3882 437 XMM3, XMM3b, XMM3c, XMM3d,
kvn@3882 438 XMM4, XMM4b, XMM4c, XMM4d,
kvn@3882 439 XMM5, XMM5b, XMM5c, XMM5d,
kvn@3882 440 XMM6, XMM6b, XMM6c, XMM6d,
kvn@3882 441 XMM7, XMM7b, XMM7c, XMM7d
kvn@3882 442 #ifdef _LP64
kvn@3882 443 ,XMM8, XMM8b, XMM8c, XMM8d,
kvn@3882 444 XMM9, XMM9b, XMM9c, XMM9d,
kvn@3882 445 XMM10, XMM10b, XMM10c, XMM10d,
kvn@3882 446 XMM11, XMM11b, XMM11c, XMM11d,
kvn@3882 447 XMM12, XMM12b, XMM12c, XMM12d,
kvn@3882 448 XMM13, XMM13b, XMM13c, XMM13d,
kvn@3882 449 XMM14, XMM14b, XMM14c, XMM14d,
kvn@3882 450 XMM15, XMM15b, XMM15c, XMM15d
kvn@3882 451 #endif
kvn@3882 452 );
kvn@3882 453
kvn@3882 454 // Class for all 256bit vector registers
kvn@3882 455 reg_class vectory_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h,
kvn@3882 456 XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h,
kvn@3882 457 XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h,
kvn@3882 458 XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h,
kvn@3882 459 XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h,
kvn@3882 460 XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h,
kvn@3882 461 XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h,
kvn@3882 462 XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h
kvn@3882 463 #ifdef _LP64
kvn@3882 464 ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h,
kvn@3882 465 XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h,
kvn@3882 466 XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h,
kvn@3882 467 XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h,
kvn@3882 468 XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h,
kvn@3882 469 XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h,
kvn@3882 470 XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h,
kvn@3882 471 XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h
kvn@3882 472 #endif
kvn@3882 473 );
kvn@3882 474
kvn@3882 475 %}
kvn@3882 476
goetz@6517 477
goetz@6517 478 //----------SOURCE BLOCK-------------------------------------------------------
goetz@6517 479 // This is a block of C++ code which provides values, functions, and
goetz@6517 480 // definitions necessary in the rest of the architecture description
goetz@6517 481
goetz@6517 482 source_hpp %{
goetz@6517 483 // Header information of the source block.
goetz@6517 484 // Method declarations/definitions which are used outside
goetz@6517 485 // the ad-scope can conveniently be defined here.
goetz@6517 486 //
goetz@6517 487 // To keep related declarations/definitions/uses close together,
goetz@6517 488 // we switch between source %{ }% and source_hpp %{ }% freely as needed.
goetz@6517 489
goetz@6517 490 class CallStubImpl {
goetz@6517 491
goetz@6517 492 //--------------------------------------------------------------
goetz@6517 493 //---< Used for optimization in Compile::shorten_branches >---
goetz@6517 494 //--------------------------------------------------------------
goetz@6517 495
goetz@6517 496 public:
goetz@6517 497 // Size of call trampoline stub.
goetz@6517 498 static uint size_call_trampoline() {
goetz@6517 499 return 0; // no call trampolines on this platform
goetz@6517 500 }
goetz@6517 501
goetz@6517 502 // number of relocations needed by a call trampoline stub
goetz@6517 503 static uint reloc_call_trampoline() {
goetz@6517 504 return 0; // no call trampolines on this platform
goetz@6517 505 }
goetz@6517 506 };
goetz@6517 507
goetz@6517 508 class HandlerImpl {
goetz@6517 509
goetz@6517 510 public:
goetz@6517 511
goetz@6517 512 static int emit_exception_handler(CodeBuffer &cbuf);
goetz@6517 513 static int emit_deopt_handler(CodeBuffer& cbuf);
goetz@6517 514
goetz@6517 515 static uint size_exception_handler() {
goetz@6517 516 // NativeCall instruction size is the same as NativeJump.
goetz@6517 517 // exception handler starts out as jump and can be patched to
goetz@6517 518 // a call be deoptimization. (4932387)
goetz@6517 519 // Note that this value is also credited (in output.cpp) to
goetz@6517 520 // the size of the code section.
goetz@6517 521 return NativeJump::instruction_size;
goetz@6517 522 }
goetz@6517 523
goetz@6517 524 #ifdef _LP64
goetz@6517 525 static uint size_deopt_handler() {
goetz@6517 526 // three 5 byte instructions
goetz@6517 527 return 15;
goetz@6517 528 }
goetz@6517 529 #else
goetz@6517 530 static uint size_deopt_handler() {
goetz@6517 531 // NativeCall instruction size is the same as NativeJump.
goetz@6517 532 // exception handler starts out as jump and can be patched to
goetz@6517 533 // a call be deoptimization. (4932387)
goetz@6517 534 // Note that this value is also credited (in output.cpp) to
goetz@6517 535 // the size of the code section.
goetz@6517 536 return 5 + NativeJump::instruction_size; // pushl(); jmp;
goetz@6517 537 }
goetz@6517 538 #endif
goetz@6517 539 };
goetz@6517 540
goetz@6517 541 %} // end source_hpp
goetz@6517 542
kvn@3390 543 source %{
goetz@6517 544
goetz@6517 545 // Emit exception handler code.
goetz@6517 546 // Stuff framesize into a register and call a VM stub routine.
goetz@6517 547 int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf) {
goetz@6517 548
goetz@6517 549 // Note that the code buffer's insts_mark is always relative to insts.
goetz@6517 550 // That's why we must use the macroassembler to generate a handler.
goetz@6517 551 MacroAssembler _masm(&cbuf);
goetz@6517 552 address base = __ start_a_stub(size_exception_handler());
goetz@6517 553 if (base == NULL) return 0; // CodeBuffer::expand failed
goetz@6517 554 int offset = __ offset();
goetz@6517 555 __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point()));
goetz@6517 556 assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
goetz@6517 557 __ end_a_stub();
goetz@6517 558 return offset;
goetz@6517 559 }
goetz@6517 560
goetz@6517 561 // Emit deopt handler code.
goetz@6517 562 int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
goetz@6517 563
goetz@6517 564 // Note that the code buffer's insts_mark is always relative to insts.
goetz@6517 565 // That's why we must use the macroassembler to generate a handler.
goetz@6517 566 MacroAssembler _masm(&cbuf);
goetz@6517 567 address base = __ start_a_stub(size_deopt_handler());
goetz@6517 568 if (base == NULL) return 0; // CodeBuffer::expand failed
goetz@6517 569 int offset = __ offset();
goetz@6517 570
goetz@6517 571 #ifdef _LP64
goetz@6517 572 address the_pc = (address) __ pc();
goetz@6517 573 Label next;
goetz@6517 574 // push a "the_pc" on the stack without destroying any registers
goetz@6517 575 // as they all may be live.
goetz@6517 576
goetz@6517 577 // push address of "next"
goetz@6517 578 __ call(next, relocInfo::none); // reloc none is fine since it is a disp32
goetz@6517 579 __ bind(next);
goetz@6517 580 // adjust it so it matches "the_pc"
goetz@6517 581 __ subptr(Address(rsp, 0), __ offset() - offset);
goetz@6517 582 #else
goetz@6517 583 InternalAddress here(__ pc());
goetz@6517 584 __ pushptr(here.addr());
goetz@6517 585 #endif
goetz@6517 586
goetz@6517 587 __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
goetz@6517 588 assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow");
goetz@6517 589 __ end_a_stub();
goetz@6517 590 return offset;
goetz@6517 591 }
goetz@6517 592
goetz@6517 593
goetz@6517 594 //=============================================================================
goetz@6517 595
kvn@3390 596 // Float masks come from different places depending on platform.
kvn@3390 597 #ifdef _LP64
kvn@3390 598 static address float_signmask() { return StubRoutines::x86::float_sign_mask(); }
kvn@3390 599 static address float_signflip() { return StubRoutines::x86::float_sign_flip(); }
kvn@3390 600 static address double_signmask() { return StubRoutines::x86::double_sign_mask(); }
kvn@3390 601 static address double_signflip() { return StubRoutines::x86::double_sign_flip(); }
kvn@3390 602 #else
kvn@3390 603 static address float_signmask() { return (address)float_signmask_pool; }
kvn@3390 604 static address float_signflip() { return (address)float_signflip_pool; }
kvn@3390 605 static address double_signmask() { return (address)double_signmask_pool; }
kvn@3390 606 static address double_signflip() { return (address)double_signflip_pool; }
kvn@3390 607 #endif
kvn@3577 608
kvn@3882 609
kvn@4001 610 const bool Matcher::match_rule_supported(int opcode) {
kvn@4001 611 if (!has_match_rule(opcode))
kvn@4001 612 return false;
kvn@4001 613
kvn@4001 614 switch (opcode) {
kvn@4001 615 case Op_PopCountI:
kvn@4001 616 case Op_PopCountL:
kvn@4001 617 if (!UsePopCountInstruction)
kvn@4001 618 return false;
kvn@4103 619 break;
kvn@4001 620 case Op_MulVI:
kvn@4001 621 if ((UseSSE < 4) && (UseAVX < 1)) // only with SSE4_1 or AVX
kvn@4001 622 return false;
kvn@4001 623 break;
roland@4106 624 case Op_CompareAndSwapL:
roland@4106 625 #ifdef _LP64
roland@4106 626 case Op_CompareAndSwapP:
roland@4106 627 #endif
roland@4106 628 if (!VM_Version::supports_cx8())
roland@4106 629 return false;
roland@4106 630 break;
kvn@4001 631 }
kvn@4001 632
kvn@4001 633 return true; // Per default match rules are supported.
kvn@4001 634 }
kvn@4001 635
kvn@3882 636 // Max vector size in bytes. 0 if not supported.
kvn@3882 637 const int Matcher::vector_width_in_bytes(BasicType bt) {
kvn@3882 638 assert(is_java_primitive(bt), "only primitive type vectors");
kvn@3882 639 if (UseSSE < 2) return 0;
kvn@3882 640 // SSE2 supports 128bit vectors for all types.
kvn@3882 641 // AVX2 supports 256bit vectors for all types.
kvn@3882 642 int size = (UseAVX > 1) ? 32 : 16;
kvn@3882 643 // AVX1 supports 256bit vectors only for FLOAT and DOUBLE.
kvn@3882 644 if (UseAVX > 0 && (bt == T_FLOAT || bt == T_DOUBLE))
kvn@3882 645 size = 32;
kvn@3882 646 // Use flag to limit vector size.
kvn@3882 647 size = MIN2(size,(int)MaxVectorSize);
kvn@3882 648 // Minimum 2 values in vector (or 4 for bytes).
kvn@3882 649 switch (bt) {
kvn@3882 650 case T_DOUBLE:
kvn@3882 651 case T_LONG:
kvn@3882 652 if (size < 16) return 0;
kvn@3882 653 case T_FLOAT:
kvn@3882 654 case T_INT:
kvn@3882 655 if (size < 8) return 0;
kvn@3882 656 case T_BOOLEAN:
kvn@3882 657 case T_BYTE:
kvn@3882 658 case T_CHAR:
kvn@3882 659 case T_SHORT:
kvn@3882 660 if (size < 4) return 0;
kvn@3882 661 break;
kvn@3882 662 default:
kvn@3882 663 ShouldNotReachHere();
kvn@3882 664 }
kvn@3882 665 return size;
kvn@3882 666 }
kvn@3882 667
kvn@3882 668 // Limits on vector size (number of elements) loaded into vector.
kvn@3882 669 const int Matcher::max_vector_size(const BasicType bt) {
kvn@3882 670 return vector_width_in_bytes(bt)/type2aelembytes(bt);
kvn@3882 671 }
kvn@3882 672 const int Matcher::min_vector_size(const BasicType bt) {
kvn@3882 673 int max_size = max_vector_size(bt);
kvn@3882 674 // Min size which can be loaded into vector is 4 bytes.
kvn@3882 675 int size = (type2aelembytes(bt) == 1) ? 4 : 2;
kvn@3882 676 return MIN2(size,max_size);
kvn@3882 677 }
kvn@3882 678
kvn@3882 679 // Vector ideal reg corresponding to specidied size in bytes
kvn@3882 680 const int Matcher::vector_ideal_reg(int size) {
kvn@3882 681 assert(MaxVectorSize >= size, "");
kvn@3882 682 switch(size) {
kvn@3882 683 case 4: return Op_VecS;
kvn@3882 684 case 8: return Op_VecD;
kvn@3882 685 case 16: return Op_VecX;
kvn@3882 686 case 32: return Op_VecY;
kvn@3882 687 }
kvn@3882 688 ShouldNotReachHere();
kvn@3882 689 return 0;
kvn@3882 690 }
kvn@3882 691
kvn@4134 692 // Only lowest bits of xmm reg are used for vector shift count.
kvn@4134 693 const int Matcher::vector_shift_count_ideal_reg(int size) {
kvn@4134 694 return Op_VecS;
kvn@4134 695 }
kvn@4134 696
kvn@3882 697 // x86 supports misaligned vectors store/load.
kvn@3882 698 const bool Matcher::misaligned_vectors_ok() {
kvn@3882 699 return !AlignVector; // can be changed by flag
kvn@3882 700 }
kvn@3882 701
kvn@6312 702 // x86 AES instructions are compatible with SunJCE expanded
kvn@6312 703 // keys, hence we do not need to pass the original key to stubs
kvn@6312 704 const bool Matcher::pass_original_key_for_aes() {
kvn@6312 705 return false;
kvn@6312 706 }
kvn@6312 707
kvn@3882 708 // Helper methods for MachSpillCopyNode::implementation().
kvn@3882 709 static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo,
kvn@3882 710 int src_hi, int dst_hi, uint ireg, outputStream* st) {
kvn@3882 711 // In 64-bit VM size calculation is very complex. Emitting instructions
kvn@3882 712 // into scratch buffer is used to get size in 64-bit VM.
kvn@3882 713 LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
kvn@3882 714 assert(ireg == Op_VecS || // 32bit vector
kvn@3882 715 (src_lo & 1) == 0 && (src_lo + 1) == src_hi &&
kvn@3882 716 (dst_lo & 1) == 0 && (dst_lo + 1) == dst_hi,
kvn@3882 717 "no non-adjacent vector moves" );
kvn@3882 718 if (cbuf) {
kvn@3882 719 MacroAssembler _masm(cbuf);
kvn@3882 720 int offset = __ offset();
kvn@3882 721 switch (ireg) {
kvn@3882 722 case Op_VecS: // copy whole register
kvn@3882 723 case Op_VecD:
kvn@3882 724 case Op_VecX:
kvn@3882 725 __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
kvn@3882 726 break;
kvn@3882 727 case Op_VecY:
kvn@3882 728 __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
kvn@3882 729 break;
kvn@3882 730 default:
kvn@3882 731 ShouldNotReachHere();
kvn@3882 732 }
kvn@3882 733 int size = __ offset() - offset;
kvn@3882 734 #ifdef ASSERT
kvn@3882 735 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
kvn@3882 736 assert(!do_size || size == 4, "incorrect size calculattion");
kvn@3882 737 #endif
kvn@3882 738 return size;
kvn@3882 739 #ifndef PRODUCT
kvn@3882 740 } else if (!do_size) {
kvn@3882 741 switch (ireg) {
kvn@3882 742 case Op_VecS:
kvn@3882 743 case Op_VecD:
kvn@3882 744 case Op_VecX:
kvn@3882 745 st->print("movdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
kvn@3882 746 break;
kvn@3882 747 case Op_VecY:
kvn@3882 748 st->print("vmovdqu %s,%s\t# spill",Matcher::regName[dst_lo],Matcher::regName[src_lo]);
kvn@3882 749 break;
kvn@3882 750 default:
kvn@3882 751 ShouldNotReachHere();
kvn@3882 752 }
kvn@3882 753 #endif
kvn@3882 754 }
kvn@3882 755 // VEX_2bytes prefix is used if UseAVX > 0, and it takes the same 2 bytes as SIMD prefix.
kvn@3882 756 return 4;
kvn@3882 757 }
kvn@3882 758
kvn@3882 759 static int vec_spill_helper(CodeBuffer *cbuf, bool do_size, bool is_load,
kvn@3882 760 int stack_offset, int reg, uint ireg, outputStream* st) {
kvn@3882 761 // In 64-bit VM size calculation is very complex. Emitting instructions
kvn@3882 762 // into scratch buffer is used to get size in 64-bit VM.
kvn@3882 763 LP64_ONLY( assert(!do_size, "this method calculates size only for 32-bit VM"); )
kvn@3882 764 if (cbuf) {
kvn@3882 765 MacroAssembler _masm(cbuf);
kvn@3882 766 int offset = __ offset();
kvn@3882 767 if (is_load) {
kvn@3882 768 switch (ireg) {
kvn@3882 769 case Op_VecS:
kvn@3882 770 __ movdl(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
kvn@3882 771 break;
kvn@3882 772 case Op_VecD:
kvn@3882 773 __ movq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
kvn@3882 774 break;
kvn@3882 775 case Op_VecX:
kvn@3882 776 __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
kvn@3882 777 break;
kvn@3882 778 case Op_VecY:
kvn@3882 779 __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
kvn@3882 780 break;
kvn@3882 781 default:
kvn@3882 782 ShouldNotReachHere();
kvn@3882 783 }
kvn@3882 784 } else { // store
kvn@3882 785 switch (ireg) {
kvn@3882 786 case Op_VecS:
kvn@3882 787 __ movdl(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
kvn@3882 788 break;
kvn@3882 789 case Op_VecD:
kvn@3882 790 __ movq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
kvn@3882 791 break;
kvn@3882 792 case Op_VecX:
kvn@3882 793 __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
kvn@3882 794 break;
kvn@3882 795 case Op_VecY:
kvn@3882 796 __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
kvn@3882 797 break;
kvn@3882 798 default:
kvn@3882 799 ShouldNotReachHere();
kvn@3882 800 }
kvn@3882 801 }
kvn@3882 802 int size = __ offset() - offset;
kvn@3882 803 #ifdef ASSERT
kvn@3882 804 int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
kvn@3882 805 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
kvn@3882 806 assert(!do_size || size == (5+offset_size), "incorrect size calculattion");
kvn@3882 807 #endif
kvn@3882 808 return size;
kvn@3882 809 #ifndef PRODUCT
kvn@3882 810 } else if (!do_size) {
kvn@3882 811 if (is_load) {
kvn@3882 812 switch (ireg) {
kvn@3882 813 case Op_VecS:
kvn@3882 814 st->print("movd %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
kvn@3882 815 break;
kvn@3882 816 case Op_VecD:
kvn@3882 817 st->print("movq %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
kvn@3882 818 break;
kvn@3882 819 case Op_VecX:
kvn@3882 820 st->print("movdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
kvn@3882 821 break;
kvn@3882 822 case Op_VecY:
kvn@3882 823 st->print("vmovdqu %s,[rsp + %d]\t# spill", Matcher::regName[reg], stack_offset);
kvn@3882 824 break;
kvn@3882 825 default:
kvn@3882 826 ShouldNotReachHere();
kvn@3882 827 }
kvn@3882 828 } else { // store
kvn@3882 829 switch (ireg) {
kvn@3882 830 case Op_VecS:
kvn@3882 831 st->print("movd [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
kvn@3882 832 break;
kvn@3882 833 case Op_VecD:
kvn@3882 834 st->print("movq [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
kvn@3882 835 break;
kvn@3882 836 case Op_VecX:
kvn@3882 837 st->print("movdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
kvn@3882 838 break;
kvn@3882 839 case Op_VecY:
kvn@3882 840 st->print("vmovdqu [rsp + %d],%s\t# spill", stack_offset, Matcher::regName[reg]);
kvn@3882 841 break;
kvn@3882 842 default:
kvn@3882 843 ShouldNotReachHere();
kvn@3882 844 }
kvn@3882 845 }
kvn@3882 846 #endif
kvn@3882 847 }
kvn@3882 848 int offset_size = (stack_offset == 0) ? 0 : ((stack_offset < 0x80) ? 1 : 4);
kvn@3882 849 // VEX_2bytes prefix is used if UseAVX > 0, so it takes the same 2 bytes as SIMD prefix.
kvn@3882 850 return 5+offset_size;
kvn@3882 851 }
kvn@3882 852
kvn@3882 853 static inline jfloat replicate4_imm(int con, int width) {
kvn@3882 854 // Load a constant of "width" (in bytes) and replicate it to fill 32bit.
kvn@3882 855 assert(width == 1 || width == 2, "only byte or short types here");
kvn@3882 856 int bit_width = width * 8;
kvn@3882 857 jint val = con;
kvn@3882 858 val &= (1 << bit_width) - 1; // mask off sign bits
kvn@3882 859 while(bit_width < 32) {
kvn@3882 860 val |= (val << bit_width);
kvn@3882 861 bit_width <<= 1;
kvn@3882 862 }
kvn@3882 863 jfloat fval = *((jfloat*) &val); // coerce to float type
kvn@3882 864 return fval;
kvn@3882 865 }
kvn@3882 866
kvn@3882 867 static inline jdouble replicate8_imm(int con, int width) {
kvn@3882 868 // Load a constant of "width" (in bytes) and replicate it to fill 64bit.
kvn@3882 869 assert(width == 1 || width == 2 || width == 4, "only byte, short or int types here");
kvn@3882 870 int bit_width = width * 8;
kvn@3882 871 jlong val = con;
kvn@3882 872 val &= (((jlong) 1) << bit_width) - 1; // mask off sign bits
kvn@3882 873 while(bit_width < 64) {
kvn@3882 874 val |= (val << bit_width);
kvn@3882 875 bit_width <<= 1;
kvn@3882 876 }
kvn@3882 877 jdouble dval = *((jdouble*) &val); // coerce to double type
kvn@3882 878 return dval;
kvn@3882 879 }
kvn@3882 880
kvn@3577 881 #ifndef PRODUCT
kvn@3577 882 void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const {
kvn@3577 883 st->print("nop \t# %d bytes pad for loops and calls", _count);
kvn@3577 884 }
kvn@3577 885 #endif
kvn@3577 886
kvn@3577 887 void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc*) const {
kvn@3577 888 MacroAssembler _masm(&cbuf);
kvn@3577 889 __ nop(_count);
kvn@3577 890 }
kvn@3577 891
kvn@3577 892 uint MachNopNode::size(PhaseRegAlloc*) const {
kvn@3577 893 return _count;
kvn@3577 894 }
kvn@3577 895
kvn@3577 896 #ifndef PRODUCT
kvn@3577 897 void MachBreakpointNode::format(PhaseRegAlloc*, outputStream* st) const {
kvn@3577 898 st->print("# breakpoint");
kvn@3577 899 }
kvn@3577 900 #endif
kvn@3577 901
kvn@3577 902 void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc* ra_) const {
kvn@3577 903 MacroAssembler _masm(&cbuf);
kvn@3577 904 __ int3();
kvn@3577 905 }
kvn@3577 906
kvn@3577 907 uint MachBreakpointNode::size(PhaseRegAlloc* ra_) const {
kvn@3577 908 return MachNode::size(ra_);
kvn@3577 909 }
kvn@3577 910
kvn@3577 911 %}
kvn@3577 912
kvn@3577 913 encode %{
kvn@3577 914
kvn@3577 915 enc_class preserve_SP %{
kvn@3577 916 debug_only(int off0 = cbuf.insts_size());
kvn@3577 917 MacroAssembler _masm(&cbuf);
kvn@3577 918 // RBP is preserved across all calls, even compiled calls.
kvn@3577 919 // Use it to preserve RSP in places where the callee might change the SP.
kvn@3577 920 __ movptr(rbp_mh_SP_save, rsp);
kvn@3577 921 debug_only(int off1 = cbuf.insts_size());
kvn@3577 922 assert(off1 - off0 == preserve_SP_size(), "correct size prediction");
kvn@3577 923 %}
kvn@3577 924
kvn@3577 925 enc_class restore_SP %{
kvn@3577 926 MacroAssembler _masm(&cbuf);
kvn@3577 927 __ movptr(rsp, rbp_mh_SP_save);
kvn@3577 928 %}
kvn@3577 929
kvn@3577 930 enc_class call_epilog %{
kvn@3577 931 if (VerifyStackAtCalls) {
kvn@3577 932 // Check that stack depth is unchanged: find majik cookie on stack
kvn@3577 933 int framesize = ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3*VMRegImpl::slots_per_word));
kvn@3577 934 MacroAssembler _masm(&cbuf);
kvn@3577 935 Label L;
kvn@3577 936 __ cmpptr(Address(rsp, framesize), (int32_t)0xbadb100d);
kvn@3577 937 __ jccb(Assembler::equal, L);
kvn@3577 938 // Die if stack mismatch
kvn@3577 939 __ int3();
kvn@3577 940 __ bind(L);
kvn@3577 941 }
kvn@3577 942 %}
kvn@3577 943
kvn@3390 944 %}
kvn@3390 945
kvn@3882 946
kvn@3882 947 //----------OPERANDS-----------------------------------------------------------
kvn@3882 948 // Operand definitions must precede instruction definitions for correct parsing
kvn@3882 949 // in the ADLC because operands constitute user defined types which are used in
kvn@3882 950 // instruction definitions.
kvn@3882 951
kvn@3882 952 // Vectors
kvn@3882 953 operand vecS() %{
kvn@3882 954 constraint(ALLOC_IN_RC(vectors_reg));
kvn@3882 955 match(VecS);
kvn@3882 956
kvn@3882 957 format %{ %}
kvn@3882 958 interface(REG_INTER);
kvn@3882 959 %}
kvn@3882 960
kvn@3882 961 operand vecD() %{
kvn@3882 962 constraint(ALLOC_IN_RC(vectord_reg));
kvn@3882 963 match(VecD);
kvn@3882 964
kvn@3882 965 format %{ %}
kvn@3882 966 interface(REG_INTER);
kvn@3882 967 %}
kvn@3882 968
kvn@3882 969 operand vecX() %{
kvn@3882 970 constraint(ALLOC_IN_RC(vectorx_reg));
kvn@3882 971 match(VecX);
kvn@3882 972
kvn@3882 973 format %{ %}
kvn@3882 974 interface(REG_INTER);
kvn@3882 975 %}
kvn@3882 976
kvn@3882 977 operand vecY() %{
kvn@3882 978 constraint(ALLOC_IN_RC(vectory_reg));
kvn@3882 979 match(VecY);
kvn@3882 980
kvn@3882 981 format %{ %}
kvn@3882 982 interface(REG_INTER);
kvn@3882 983 %}
kvn@3882 984
kvn@3882 985
kvn@3390 986 // INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit)
kvn@3390 987
kvn@3577 988 // ============================================================================
kvn@3577 989
kvn@3577 990 instruct ShouldNotReachHere() %{
kvn@3577 991 match(Halt);
kvn@3577 992 format %{ "int3\t# ShouldNotReachHere" %}
kvn@3577 993 ins_encode %{
kvn@3577 994 __ int3();
kvn@3577 995 %}
kvn@3577 996 ins_pipe(pipe_slow);
kvn@3577 997 %}
kvn@3577 998
kvn@3577 999 // ============================================================================
kvn@3577 1000
kvn@3390 1001 instruct addF_reg(regF dst, regF src) %{
kvn@3390 1002 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1003 match(Set dst (AddF dst src));
kvn@3390 1004
kvn@3390 1005 format %{ "addss $dst, $src" %}
kvn@3390 1006 ins_cost(150);
kvn@3390 1007 ins_encode %{
kvn@3390 1008 __ addss($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1009 %}
kvn@3390 1010 ins_pipe(pipe_slow);
kvn@3390 1011 %}
kvn@3390 1012
kvn@3390 1013 instruct addF_mem(regF dst, memory src) %{
kvn@3390 1014 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1015 match(Set dst (AddF dst (LoadF src)));
kvn@3390 1016
kvn@3390 1017 format %{ "addss $dst, $src" %}
kvn@3390 1018 ins_cost(150);
kvn@3390 1019 ins_encode %{
kvn@3390 1020 __ addss($dst$$XMMRegister, $src$$Address);
kvn@3390 1021 %}
kvn@3390 1022 ins_pipe(pipe_slow);
kvn@3390 1023 %}
kvn@3390 1024
kvn@3390 1025 instruct addF_imm(regF dst, immF con) %{
kvn@3390 1026 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1027 match(Set dst (AddF dst con));
kvn@3390 1028 format %{ "addss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1029 ins_cost(150);
kvn@3390 1030 ins_encode %{
kvn@3390 1031 __ addss($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1032 %}
kvn@3390 1033 ins_pipe(pipe_slow);
kvn@3390 1034 %}
kvn@3390 1035
kvn@3929 1036 instruct addF_reg_reg(regF dst, regF src1, regF src2) %{
kvn@3390 1037 predicate(UseAVX > 0);
kvn@3390 1038 match(Set dst (AddF src1 src2));
kvn@3390 1039
kvn@3390 1040 format %{ "vaddss $dst, $src1, $src2" %}
kvn@3390 1041 ins_cost(150);
kvn@3390 1042 ins_encode %{
kvn@3390 1043 __ vaddss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1044 %}
kvn@3390 1045 ins_pipe(pipe_slow);
kvn@3390 1046 %}
kvn@3390 1047
kvn@3929 1048 instruct addF_reg_mem(regF dst, regF src1, memory src2) %{
kvn@3390 1049 predicate(UseAVX > 0);
kvn@3390 1050 match(Set dst (AddF src1 (LoadF src2)));
kvn@3390 1051
kvn@3390 1052 format %{ "vaddss $dst, $src1, $src2" %}
kvn@3390 1053 ins_cost(150);
kvn@3390 1054 ins_encode %{
kvn@3390 1055 __ vaddss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1056 %}
kvn@3390 1057 ins_pipe(pipe_slow);
kvn@3390 1058 %}
kvn@3390 1059
kvn@3929 1060 instruct addF_reg_imm(regF dst, regF src, immF con) %{
kvn@3390 1061 predicate(UseAVX > 0);
kvn@3390 1062 match(Set dst (AddF src con));
kvn@3390 1063
kvn@3390 1064 format %{ "vaddss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1065 ins_cost(150);
kvn@3390 1066 ins_encode %{
kvn@3390 1067 __ vaddss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1068 %}
kvn@3390 1069 ins_pipe(pipe_slow);
kvn@3390 1070 %}
kvn@3390 1071
kvn@3390 1072 instruct addD_reg(regD dst, regD src) %{
kvn@3390 1073 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1074 match(Set dst (AddD dst src));
kvn@3390 1075
kvn@3390 1076 format %{ "addsd $dst, $src" %}
kvn@3390 1077 ins_cost(150);
kvn@3390 1078 ins_encode %{
kvn@3390 1079 __ addsd($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1080 %}
kvn@3390 1081 ins_pipe(pipe_slow);
kvn@3390 1082 %}
kvn@3390 1083
kvn@3390 1084 instruct addD_mem(regD dst, memory src) %{
kvn@3390 1085 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1086 match(Set dst (AddD dst (LoadD src)));
kvn@3390 1087
kvn@3390 1088 format %{ "addsd $dst, $src" %}
kvn@3390 1089 ins_cost(150);
kvn@3390 1090 ins_encode %{
kvn@3390 1091 __ addsd($dst$$XMMRegister, $src$$Address);
kvn@3390 1092 %}
kvn@3390 1093 ins_pipe(pipe_slow);
kvn@3390 1094 %}
kvn@3390 1095
kvn@3390 1096 instruct addD_imm(regD dst, immD con) %{
kvn@3390 1097 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1098 match(Set dst (AddD dst con));
kvn@3390 1099 format %{ "addsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1100 ins_cost(150);
kvn@3390 1101 ins_encode %{
kvn@3390 1102 __ addsd($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1103 %}
kvn@3390 1104 ins_pipe(pipe_slow);
kvn@3390 1105 %}
kvn@3390 1106
kvn@3929 1107 instruct addD_reg_reg(regD dst, regD src1, regD src2) %{
kvn@3390 1108 predicate(UseAVX > 0);
kvn@3390 1109 match(Set dst (AddD src1 src2));
kvn@3390 1110
kvn@3390 1111 format %{ "vaddsd $dst, $src1, $src2" %}
kvn@3390 1112 ins_cost(150);
kvn@3390 1113 ins_encode %{
kvn@3390 1114 __ vaddsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1115 %}
kvn@3390 1116 ins_pipe(pipe_slow);
kvn@3390 1117 %}
kvn@3390 1118
kvn@3929 1119 instruct addD_reg_mem(regD dst, regD src1, memory src2) %{
kvn@3390 1120 predicate(UseAVX > 0);
kvn@3390 1121 match(Set dst (AddD src1 (LoadD src2)));
kvn@3390 1122
kvn@3390 1123 format %{ "vaddsd $dst, $src1, $src2" %}
kvn@3390 1124 ins_cost(150);
kvn@3390 1125 ins_encode %{
kvn@3390 1126 __ vaddsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1127 %}
kvn@3390 1128 ins_pipe(pipe_slow);
kvn@3390 1129 %}
kvn@3390 1130
kvn@3929 1131 instruct addD_reg_imm(regD dst, regD src, immD con) %{
kvn@3390 1132 predicate(UseAVX > 0);
kvn@3390 1133 match(Set dst (AddD src con));
kvn@3390 1134
kvn@3390 1135 format %{ "vaddsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1136 ins_cost(150);
kvn@3390 1137 ins_encode %{
kvn@3390 1138 __ vaddsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1139 %}
kvn@3390 1140 ins_pipe(pipe_slow);
kvn@3390 1141 %}
kvn@3390 1142
kvn@3390 1143 instruct subF_reg(regF dst, regF src) %{
kvn@3390 1144 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1145 match(Set dst (SubF dst src));
kvn@3390 1146
kvn@3390 1147 format %{ "subss $dst, $src" %}
kvn@3390 1148 ins_cost(150);
kvn@3390 1149 ins_encode %{
kvn@3390 1150 __ subss($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1151 %}
kvn@3390 1152 ins_pipe(pipe_slow);
kvn@3390 1153 %}
kvn@3390 1154
kvn@3390 1155 instruct subF_mem(regF dst, memory src) %{
kvn@3390 1156 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1157 match(Set dst (SubF dst (LoadF src)));
kvn@3390 1158
kvn@3390 1159 format %{ "subss $dst, $src" %}
kvn@3390 1160 ins_cost(150);
kvn@3390 1161 ins_encode %{
kvn@3390 1162 __ subss($dst$$XMMRegister, $src$$Address);
kvn@3390 1163 %}
kvn@3390 1164 ins_pipe(pipe_slow);
kvn@3390 1165 %}
kvn@3390 1166
kvn@3390 1167 instruct subF_imm(regF dst, immF con) %{
kvn@3390 1168 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1169 match(Set dst (SubF dst con));
kvn@3390 1170 format %{ "subss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1171 ins_cost(150);
kvn@3390 1172 ins_encode %{
kvn@3390 1173 __ subss($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1174 %}
kvn@3390 1175 ins_pipe(pipe_slow);
kvn@3390 1176 %}
kvn@3390 1177
kvn@3929 1178 instruct subF_reg_reg(regF dst, regF src1, regF src2) %{
kvn@3390 1179 predicate(UseAVX > 0);
kvn@3390 1180 match(Set dst (SubF src1 src2));
kvn@3390 1181
kvn@3390 1182 format %{ "vsubss $dst, $src1, $src2" %}
kvn@3390 1183 ins_cost(150);
kvn@3390 1184 ins_encode %{
kvn@3390 1185 __ vsubss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1186 %}
kvn@3390 1187 ins_pipe(pipe_slow);
kvn@3390 1188 %}
kvn@3390 1189
kvn@3929 1190 instruct subF_reg_mem(regF dst, regF src1, memory src2) %{
kvn@3390 1191 predicate(UseAVX > 0);
kvn@3390 1192 match(Set dst (SubF src1 (LoadF src2)));
kvn@3390 1193
kvn@3390 1194 format %{ "vsubss $dst, $src1, $src2" %}
kvn@3390 1195 ins_cost(150);
kvn@3390 1196 ins_encode %{
kvn@3390 1197 __ vsubss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1198 %}
kvn@3390 1199 ins_pipe(pipe_slow);
kvn@3390 1200 %}
kvn@3390 1201
kvn@3929 1202 instruct subF_reg_imm(regF dst, regF src, immF con) %{
kvn@3390 1203 predicate(UseAVX > 0);
kvn@3390 1204 match(Set dst (SubF src con));
kvn@3390 1205
kvn@3390 1206 format %{ "vsubss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1207 ins_cost(150);
kvn@3390 1208 ins_encode %{
kvn@3390 1209 __ vsubss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1210 %}
kvn@3390 1211 ins_pipe(pipe_slow);
kvn@3390 1212 %}
kvn@3390 1213
kvn@3390 1214 instruct subD_reg(regD dst, regD src) %{
kvn@3390 1215 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1216 match(Set dst (SubD dst src));
kvn@3390 1217
kvn@3390 1218 format %{ "subsd $dst, $src" %}
kvn@3390 1219 ins_cost(150);
kvn@3390 1220 ins_encode %{
kvn@3390 1221 __ subsd($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1222 %}
kvn@3390 1223 ins_pipe(pipe_slow);
kvn@3390 1224 %}
kvn@3390 1225
kvn@3390 1226 instruct subD_mem(regD dst, memory src) %{
kvn@3390 1227 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1228 match(Set dst (SubD dst (LoadD src)));
kvn@3390 1229
kvn@3390 1230 format %{ "subsd $dst, $src" %}
kvn@3390 1231 ins_cost(150);
kvn@3390 1232 ins_encode %{
kvn@3390 1233 __ subsd($dst$$XMMRegister, $src$$Address);
kvn@3390 1234 %}
kvn@3390 1235 ins_pipe(pipe_slow);
kvn@3390 1236 %}
kvn@3390 1237
kvn@3390 1238 instruct subD_imm(regD dst, immD con) %{
kvn@3390 1239 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1240 match(Set dst (SubD dst con));
kvn@3390 1241 format %{ "subsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1242 ins_cost(150);
kvn@3390 1243 ins_encode %{
kvn@3390 1244 __ subsd($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1245 %}
kvn@3390 1246 ins_pipe(pipe_slow);
kvn@3390 1247 %}
kvn@3390 1248
kvn@3929 1249 instruct subD_reg_reg(regD dst, regD src1, regD src2) %{
kvn@3390 1250 predicate(UseAVX > 0);
kvn@3390 1251 match(Set dst (SubD src1 src2));
kvn@3390 1252
kvn@3390 1253 format %{ "vsubsd $dst, $src1, $src2" %}
kvn@3390 1254 ins_cost(150);
kvn@3390 1255 ins_encode %{
kvn@3390 1256 __ vsubsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1257 %}
kvn@3390 1258 ins_pipe(pipe_slow);
kvn@3390 1259 %}
kvn@3390 1260
kvn@3929 1261 instruct subD_reg_mem(regD dst, regD src1, memory src2) %{
kvn@3390 1262 predicate(UseAVX > 0);
kvn@3390 1263 match(Set dst (SubD src1 (LoadD src2)));
kvn@3390 1264
kvn@3390 1265 format %{ "vsubsd $dst, $src1, $src2" %}
kvn@3390 1266 ins_cost(150);
kvn@3390 1267 ins_encode %{
kvn@3390 1268 __ vsubsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1269 %}
kvn@3390 1270 ins_pipe(pipe_slow);
kvn@3390 1271 %}
kvn@3390 1272
kvn@3929 1273 instruct subD_reg_imm(regD dst, regD src, immD con) %{
kvn@3390 1274 predicate(UseAVX > 0);
kvn@3390 1275 match(Set dst (SubD src con));
kvn@3390 1276
kvn@3390 1277 format %{ "vsubsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1278 ins_cost(150);
kvn@3390 1279 ins_encode %{
kvn@3390 1280 __ vsubsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1281 %}
kvn@3390 1282 ins_pipe(pipe_slow);
kvn@3390 1283 %}
kvn@3390 1284
kvn@3390 1285 instruct mulF_reg(regF dst, regF src) %{
kvn@3390 1286 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1287 match(Set dst (MulF dst src));
kvn@3390 1288
kvn@3390 1289 format %{ "mulss $dst, $src" %}
kvn@3390 1290 ins_cost(150);
kvn@3390 1291 ins_encode %{
kvn@3390 1292 __ mulss($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1293 %}
kvn@3390 1294 ins_pipe(pipe_slow);
kvn@3390 1295 %}
kvn@3390 1296
kvn@3390 1297 instruct mulF_mem(regF dst, memory src) %{
kvn@3390 1298 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1299 match(Set dst (MulF dst (LoadF src)));
kvn@3390 1300
kvn@3390 1301 format %{ "mulss $dst, $src" %}
kvn@3390 1302 ins_cost(150);
kvn@3390 1303 ins_encode %{
kvn@3390 1304 __ mulss($dst$$XMMRegister, $src$$Address);
kvn@3390 1305 %}
kvn@3390 1306 ins_pipe(pipe_slow);
kvn@3390 1307 %}
kvn@3390 1308
kvn@3390 1309 instruct mulF_imm(regF dst, immF con) %{
kvn@3390 1310 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1311 match(Set dst (MulF dst con));
kvn@3390 1312 format %{ "mulss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1313 ins_cost(150);
kvn@3390 1314 ins_encode %{
kvn@3390 1315 __ mulss($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1316 %}
kvn@3390 1317 ins_pipe(pipe_slow);
kvn@3390 1318 %}
kvn@3390 1319
kvn@3929 1320 instruct mulF_reg_reg(regF dst, regF src1, regF src2) %{
kvn@3390 1321 predicate(UseAVX > 0);
kvn@3390 1322 match(Set dst (MulF src1 src2));
kvn@3390 1323
kvn@3390 1324 format %{ "vmulss $dst, $src1, $src2" %}
kvn@3390 1325 ins_cost(150);
kvn@3390 1326 ins_encode %{
kvn@3390 1327 __ vmulss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1328 %}
kvn@3390 1329 ins_pipe(pipe_slow);
kvn@3390 1330 %}
kvn@3390 1331
kvn@3929 1332 instruct mulF_reg_mem(regF dst, regF src1, memory src2) %{
kvn@3390 1333 predicate(UseAVX > 0);
kvn@3390 1334 match(Set dst (MulF src1 (LoadF src2)));
kvn@3390 1335
kvn@3390 1336 format %{ "vmulss $dst, $src1, $src2" %}
kvn@3390 1337 ins_cost(150);
kvn@3390 1338 ins_encode %{
kvn@3390 1339 __ vmulss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1340 %}
kvn@3390 1341 ins_pipe(pipe_slow);
kvn@3390 1342 %}
kvn@3390 1343
kvn@3929 1344 instruct mulF_reg_imm(regF dst, regF src, immF con) %{
kvn@3390 1345 predicate(UseAVX > 0);
kvn@3390 1346 match(Set dst (MulF src con));
kvn@3390 1347
kvn@3390 1348 format %{ "vmulss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1349 ins_cost(150);
kvn@3390 1350 ins_encode %{
kvn@3390 1351 __ vmulss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1352 %}
kvn@3390 1353 ins_pipe(pipe_slow);
kvn@3390 1354 %}
kvn@3390 1355
kvn@3390 1356 instruct mulD_reg(regD dst, regD src) %{
kvn@3390 1357 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1358 match(Set dst (MulD dst src));
kvn@3390 1359
kvn@3390 1360 format %{ "mulsd $dst, $src" %}
kvn@3390 1361 ins_cost(150);
kvn@3390 1362 ins_encode %{
kvn@3390 1363 __ mulsd($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1364 %}
kvn@3390 1365 ins_pipe(pipe_slow);
kvn@3390 1366 %}
kvn@3390 1367
kvn@3390 1368 instruct mulD_mem(regD dst, memory src) %{
kvn@3390 1369 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1370 match(Set dst (MulD dst (LoadD src)));
kvn@3390 1371
kvn@3390 1372 format %{ "mulsd $dst, $src" %}
kvn@3390 1373 ins_cost(150);
kvn@3390 1374 ins_encode %{
kvn@3390 1375 __ mulsd($dst$$XMMRegister, $src$$Address);
kvn@3390 1376 %}
kvn@3390 1377 ins_pipe(pipe_slow);
kvn@3390 1378 %}
kvn@3390 1379
kvn@3390 1380 instruct mulD_imm(regD dst, immD con) %{
kvn@3390 1381 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1382 match(Set dst (MulD dst con));
kvn@3390 1383 format %{ "mulsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1384 ins_cost(150);
kvn@3390 1385 ins_encode %{
kvn@3390 1386 __ mulsd($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1387 %}
kvn@3390 1388 ins_pipe(pipe_slow);
kvn@3390 1389 %}
kvn@3390 1390
kvn@3929 1391 instruct mulD_reg_reg(regD dst, regD src1, regD src2) %{
kvn@3390 1392 predicate(UseAVX > 0);
kvn@3390 1393 match(Set dst (MulD src1 src2));
kvn@3390 1394
kvn@3390 1395 format %{ "vmulsd $dst, $src1, $src2" %}
kvn@3390 1396 ins_cost(150);
kvn@3390 1397 ins_encode %{
kvn@3390 1398 __ vmulsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1399 %}
kvn@3390 1400 ins_pipe(pipe_slow);
kvn@3390 1401 %}
kvn@3390 1402
kvn@3929 1403 instruct mulD_reg_mem(regD dst, regD src1, memory src2) %{
kvn@3390 1404 predicate(UseAVX > 0);
kvn@3390 1405 match(Set dst (MulD src1 (LoadD src2)));
kvn@3390 1406
kvn@3390 1407 format %{ "vmulsd $dst, $src1, $src2" %}
kvn@3390 1408 ins_cost(150);
kvn@3390 1409 ins_encode %{
kvn@3390 1410 __ vmulsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1411 %}
kvn@3390 1412 ins_pipe(pipe_slow);
kvn@3390 1413 %}
kvn@3390 1414
kvn@3929 1415 instruct mulD_reg_imm(regD dst, regD src, immD con) %{
kvn@3390 1416 predicate(UseAVX > 0);
kvn@3390 1417 match(Set dst (MulD src con));
kvn@3390 1418
kvn@3390 1419 format %{ "vmulsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1420 ins_cost(150);
kvn@3390 1421 ins_encode %{
kvn@3390 1422 __ vmulsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1423 %}
kvn@3390 1424 ins_pipe(pipe_slow);
kvn@3390 1425 %}
kvn@3390 1426
kvn@3390 1427 instruct divF_reg(regF dst, regF src) %{
kvn@3390 1428 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1429 match(Set dst (DivF dst src));
kvn@3390 1430
kvn@3390 1431 format %{ "divss $dst, $src" %}
kvn@3390 1432 ins_cost(150);
kvn@3390 1433 ins_encode %{
kvn@3390 1434 __ divss($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1435 %}
kvn@3390 1436 ins_pipe(pipe_slow);
kvn@3390 1437 %}
kvn@3390 1438
kvn@3390 1439 instruct divF_mem(regF dst, memory src) %{
kvn@3390 1440 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1441 match(Set dst (DivF dst (LoadF src)));
kvn@3390 1442
kvn@3390 1443 format %{ "divss $dst, $src" %}
kvn@3390 1444 ins_cost(150);
kvn@3390 1445 ins_encode %{
kvn@3390 1446 __ divss($dst$$XMMRegister, $src$$Address);
kvn@3390 1447 %}
kvn@3390 1448 ins_pipe(pipe_slow);
kvn@3390 1449 %}
kvn@3390 1450
kvn@3390 1451 instruct divF_imm(regF dst, immF con) %{
kvn@3390 1452 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1453 match(Set dst (DivF dst con));
kvn@3390 1454 format %{ "divss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1455 ins_cost(150);
kvn@3390 1456 ins_encode %{
kvn@3390 1457 __ divss($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1458 %}
kvn@3390 1459 ins_pipe(pipe_slow);
kvn@3390 1460 %}
kvn@3390 1461
kvn@3929 1462 instruct divF_reg_reg(regF dst, regF src1, regF src2) %{
kvn@3390 1463 predicate(UseAVX > 0);
kvn@3390 1464 match(Set dst (DivF src1 src2));
kvn@3390 1465
kvn@3390 1466 format %{ "vdivss $dst, $src1, $src2" %}
kvn@3390 1467 ins_cost(150);
kvn@3390 1468 ins_encode %{
kvn@3390 1469 __ vdivss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1470 %}
kvn@3390 1471 ins_pipe(pipe_slow);
kvn@3390 1472 %}
kvn@3390 1473
kvn@3929 1474 instruct divF_reg_mem(regF dst, regF src1, memory src2) %{
kvn@3390 1475 predicate(UseAVX > 0);
kvn@3390 1476 match(Set dst (DivF src1 (LoadF src2)));
kvn@3390 1477
kvn@3390 1478 format %{ "vdivss $dst, $src1, $src2" %}
kvn@3390 1479 ins_cost(150);
kvn@3390 1480 ins_encode %{
kvn@3390 1481 __ vdivss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1482 %}
kvn@3390 1483 ins_pipe(pipe_slow);
kvn@3390 1484 %}
kvn@3390 1485
kvn@3929 1486 instruct divF_reg_imm(regF dst, regF src, immF con) %{
kvn@3390 1487 predicate(UseAVX > 0);
kvn@3390 1488 match(Set dst (DivF src con));
kvn@3390 1489
kvn@3390 1490 format %{ "vdivss $dst, $src, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1491 ins_cost(150);
kvn@3390 1492 ins_encode %{
kvn@3390 1493 __ vdivss($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1494 %}
kvn@3390 1495 ins_pipe(pipe_slow);
kvn@3390 1496 %}
kvn@3390 1497
kvn@3390 1498 instruct divD_reg(regD dst, regD src) %{
kvn@3390 1499 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1500 match(Set dst (DivD dst src));
kvn@3390 1501
kvn@3390 1502 format %{ "divsd $dst, $src" %}
kvn@3390 1503 ins_cost(150);
kvn@3390 1504 ins_encode %{
kvn@3390 1505 __ divsd($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1506 %}
kvn@3390 1507 ins_pipe(pipe_slow);
kvn@3390 1508 %}
kvn@3390 1509
kvn@3390 1510 instruct divD_mem(regD dst, memory src) %{
kvn@3390 1511 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1512 match(Set dst (DivD dst (LoadD src)));
kvn@3390 1513
kvn@3390 1514 format %{ "divsd $dst, $src" %}
kvn@3390 1515 ins_cost(150);
kvn@3390 1516 ins_encode %{
kvn@3390 1517 __ divsd($dst$$XMMRegister, $src$$Address);
kvn@3390 1518 %}
kvn@3390 1519 ins_pipe(pipe_slow);
kvn@3390 1520 %}
kvn@3390 1521
kvn@3390 1522 instruct divD_imm(regD dst, immD con) %{
kvn@3390 1523 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1524 match(Set dst (DivD dst con));
kvn@3390 1525 format %{ "divsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1526 ins_cost(150);
kvn@3390 1527 ins_encode %{
kvn@3390 1528 __ divsd($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1529 %}
kvn@3390 1530 ins_pipe(pipe_slow);
kvn@3390 1531 %}
kvn@3390 1532
kvn@3929 1533 instruct divD_reg_reg(regD dst, regD src1, regD src2) %{
kvn@3390 1534 predicate(UseAVX > 0);
kvn@3390 1535 match(Set dst (DivD src1 src2));
kvn@3390 1536
kvn@3390 1537 format %{ "vdivsd $dst, $src1, $src2" %}
kvn@3390 1538 ins_cost(150);
kvn@3390 1539 ins_encode %{
kvn@3390 1540 __ vdivsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister);
kvn@3390 1541 %}
kvn@3390 1542 ins_pipe(pipe_slow);
kvn@3390 1543 %}
kvn@3390 1544
kvn@3929 1545 instruct divD_reg_mem(regD dst, regD src1, memory src2) %{
kvn@3390 1546 predicate(UseAVX > 0);
kvn@3390 1547 match(Set dst (DivD src1 (LoadD src2)));
kvn@3390 1548
kvn@3390 1549 format %{ "vdivsd $dst, $src1, $src2" %}
kvn@3390 1550 ins_cost(150);
kvn@3390 1551 ins_encode %{
kvn@3390 1552 __ vdivsd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$Address);
kvn@3390 1553 %}
kvn@3390 1554 ins_pipe(pipe_slow);
kvn@3390 1555 %}
kvn@3390 1556
kvn@3929 1557 instruct divD_reg_imm(regD dst, regD src, immD con) %{
kvn@3390 1558 predicate(UseAVX > 0);
kvn@3390 1559 match(Set dst (DivD src con));
kvn@3390 1560
kvn@3390 1561 format %{ "vdivsd $dst, $src, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1562 ins_cost(150);
kvn@3390 1563 ins_encode %{
kvn@3390 1564 __ vdivsd($dst$$XMMRegister, $src$$XMMRegister, $constantaddress($con));
kvn@3390 1565 %}
kvn@3390 1566 ins_pipe(pipe_slow);
kvn@3390 1567 %}
kvn@3390 1568
kvn@3390 1569 instruct absF_reg(regF dst) %{
kvn@3390 1570 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1571 match(Set dst (AbsF dst));
kvn@3390 1572 ins_cost(150);
kvn@3390 1573 format %{ "andps $dst, [0x7fffffff]\t# abs float by sign masking" %}
kvn@3390 1574 ins_encode %{
kvn@3390 1575 __ andps($dst$$XMMRegister, ExternalAddress(float_signmask()));
kvn@3390 1576 %}
kvn@3390 1577 ins_pipe(pipe_slow);
kvn@3390 1578 %}
kvn@3390 1579
kvn@3929 1580 instruct absF_reg_reg(regF dst, regF src) %{
kvn@3390 1581 predicate(UseAVX > 0);
kvn@3390 1582 match(Set dst (AbsF src));
kvn@3390 1583 ins_cost(150);
kvn@3390 1584 format %{ "vandps $dst, $src, [0x7fffffff]\t# abs float by sign masking" %}
kvn@3390 1585 ins_encode %{
kvn@4001 1586 bool vector256 = false;
kvn@3390 1587 __ vandps($dst$$XMMRegister, $src$$XMMRegister,
kvn@4001 1588 ExternalAddress(float_signmask()), vector256);
kvn@3390 1589 %}
kvn@3390 1590 ins_pipe(pipe_slow);
kvn@3390 1591 %}
kvn@3390 1592
kvn@3390 1593 instruct absD_reg(regD dst) %{
kvn@3390 1594 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1595 match(Set dst (AbsD dst));
kvn@3390 1596 ins_cost(150);
kvn@3390 1597 format %{ "andpd $dst, [0x7fffffffffffffff]\t"
kvn@3390 1598 "# abs double by sign masking" %}
kvn@3390 1599 ins_encode %{
kvn@3390 1600 __ andpd($dst$$XMMRegister, ExternalAddress(double_signmask()));
kvn@3390 1601 %}
kvn@3390 1602 ins_pipe(pipe_slow);
kvn@3390 1603 %}
kvn@3390 1604
kvn@3929 1605 instruct absD_reg_reg(regD dst, regD src) %{
kvn@3390 1606 predicate(UseAVX > 0);
kvn@3390 1607 match(Set dst (AbsD src));
kvn@3390 1608 ins_cost(150);
kvn@3390 1609 format %{ "vandpd $dst, $src, [0x7fffffffffffffff]\t"
kvn@3390 1610 "# abs double by sign masking" %}
kvn@3390 1611 ins_encode %{
kvn@4001 1612 bool vector256 = false;
kvn@3390 1613 __ vandpd($dst$$XMMRegister, $src$$XMMRegister,
kvn@4001 1614 ExternalAddress(double_signmask()), vector256);
kvn@3390 1615 %}
kvn@3390 1616 ins_pipe(pipe_slow);
kvn@3390 1617 %}
kvn@3390 1618
kvn@3390 1619 instruct negF_reg(regF dst) %{
kvn@3390 1620 predicate((UseSSE>=1) && (UseAVX == 0));
kvn@3390 1621 match(Set dst (NegF dst));
kvn@3390 1622 ins_cost(150);
kvn@3390 1623 format %{ "xorps $dst, [0x80000000]\t# neg float by sign flipping" %}
kvn@3390 1624 ins_encode %{
kvn@3390 1625 __ xorps($dst$$XMMRegister, ExternalAddress(float_signflip()));
kvn@3390 1626 %}
kvn@3390 1627 ins_pipe(pipe_slow);
kvn@3390 1628 %}
kvn@3390 1629
kvn@3929 1630 instruct negF_reg_reg(regF dst, regF src) %{
kvn@3390 1631 predicate(UseAVX > 0);
kvn@3390 1632 match(Set dst (NegF src));
kvn@3390 1633 ins_cost(150);
kvn@3390 1634 format %{ "vxorps $dst, $src, [0x80000000]\t# neg float by sign flipping" %}
kvn@3390 1635 ins_encode %{
kvn@4001 1636 bool vector256 = false;
kvn@3390 1637 __ vxorps($dst$$XMMRegister, $src$$XMMRegister,
kvn@4001 1638 ExternalAddress(float_signflip()), vector256);
kvn@3390 1639 %}
kvn@3390 1640 ins_pipe(pipe_slow);
kvn@3390 1641 %}
kvn@3390 1642
kvn@3390 1643 instruct negD_reg(regD dst) %{
kvn@3390 1644 predicate((UseSSE>=2) && (UseAVX == 0));
kvn@3390 1645 match(Set dst (NegD dst));
kvn@3390 1646 ins_cost(150);
kvn@3390 1647 format %{ "xorpd $dst, [0x8000000000000000]\t"
kvn@3390 1648 "# neg double by sign flipping" %}
kvn@3390 1649 ins_encode %{
kvn@3390 1650 __ xorpd($dst$$XMMRegister, ExternalAddress(double_signflip()));
kvn@3390 1651 %}
kvn@3390 1652 ins_pipe(pipe_slow);
kvn@3390 1653 %}
kvn@3390 1654
kvn@3929 1655 instruct negD_reg_reg(regD dst, regD src) %{
kvn@3390 1656 predicate(UseAVX > 0);
kvn@3390 1657 match(Set dst (NegD src));
kvn@3390 1658 ins_cost(150);
kvn@3390 1659 format %{ "vxorpd $dst, $src, [0x8000000000000000]\t"
kvn@3390 1660 "# neg double by sign flipping" %}
kvn@3390 1661 ins_encode %{
kvn@4001 1662 bool vector256 = false;
kvn@3390 1663 __ vxorpd($dst$$XMMRegister, $src$$XMMRegister,
kvn@4001 1664 ExternalAddress(double_signflip()), vector256);
kvn@3390 1665 %}
kvn@3390 1666 ins_pipe(pipe_slow);
kvn@3390 1667 %}
kvn@3390 1668
kvn@3390 1669 instruct sqrtF_reg(regF dst, regF src) %{
kvn@3390 1670 predicate(UseSSE>=1);
kvn@3390 1671 match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
kvn@3390 1672
kvn@3390 1673 format %{ "sqrtss $dst, $src" %}
kvn@3390 1674 ins_cost(150);
kvn@3390 1675 ins_encode %{
kvn@3390 1676 __ sqrtss($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1677 %}
kvn@3390 1678 ins_pipe(pipe_slow);
kvn@3390 1679 %}
kvn@3390 1680
kvn@3390 1681 instruct sqrtF_mem(regF dst, memory src) %{
kvn@3390 1682 predicate(UseSSE>=1);
kvn@3390 1683 match(Set dst (ConvD2F (SqrtD (ConvF2D (LoadF src)))));
kvn@3390 1684
kvn@3390 1685 format %{ "sqrtss $dst, $src" %}
kvn@3390 1686 ins_cost(150);
kvn@3390 1687 ins_encode %{
kvn@3390 1688 __ sqrtss($dst$$XMMRegister, $src$$Address);
kvn@3390 1689 %}
kvn@3390 1690 ins_pipe(pipe_slow);
kvn@3390 1691 %}
kvn@3390 1692
kvn@3390 1693 instruct sqrtF_imm(regF dst, immF con) %{
kvn@3390 1694 predicate(UseSSE>=1);
kvn@3390 1695 match(Set dst (ConvD2F (SqrtD (ConvF2D con))));
kvn@3390 1696 format %{ "sqrtss $dst, [$constantaddress]\t# load from constant table: float=$con" %}
kvn@3390 1697 ins_cost(150);
kvn@3390 1698 ins_encode %{
kvn@3390 1699 __ sqrtss($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1700 %}
kvn@3390 1701 ins_pipe(pipe_slow);
kvn@3390 1702 %}
kvn@3390 1703
kvn@3390 1704 instruct sqrtD_reg(regD dst, regD src) %{
kvn@3390 1705 predicate(UseSSE>=2);
kvn@3390 1706 match(Set dst (SqrtD src));
kvn@3390 1707
kvn@3390 1708 format %{ "sqrtsd $dst, $src" %}
kvn@3390 1709 ins_cost(150);
kvn@3390 1710 ins_encode %{
kvn@3390 1711 __ sqrtsd($dst$$XMMRegister, $src$$XMMRegister);
kvn@3390 1712 %}
kvn@3390 1713 ins_pipe(pipe_slow);
kvn@3390 1714 %}
kvn@3390 1715
kvn@3390 1716 instruct sqrtD_mem(regD dst, memory src) %{
kvn@3390 1717 predicate(UseSSE>=2);
kvn@3390 1718 match(Set dst (SqrtD (LoadD src)));
kvn@3390 1719
kvn@3390 1720 format %{ "sqrtsd $dst, $src" %}
kvn@3390 1721 ins_cost(150);
kvn@3390 1722 ins_encode %{
kvn@3390 1723 __ sqrtsd($dst$$XMMRegister, $src$$Address);
kvn@3390 1724 %}
kvn@3390 1725 ins_pipe(pipe_slow);
kvn@3390 1726 %}
kvn@3390 1727
kvn@3390 1728 instruct sqrtD_imm(regD dst, immD con) %{
kvn@3390 1729 predicate(UseSSE>=2);
kvn@3390 1730 match(Set dst (SqrtD con));
kvn@3390 1731 format %{ "sqrtsd $dst, [$constantaddress]\t# load from constant table: double=$con" %}
kvn@3390 1732 ins_cost(150);
kvn@3390 1733 ins_encode %{
kvn@3390 1734 __ sqrtsd($dst$$XMMRegister, $constantaddress($con));
kvn@3390 1735 %}
kvn@3390 1736 ins_pipe(pipe_slow);
kvn@3390 1737 %}
kvn@3390 1738
kvn@3882 1739
kvn@3882 1740 // ====================VECTOR INSTRUCTIONS=====================================
kvn@3882 1741
kvn@3882 1742 // Load vectors (4 bytes long)
kvn@3882 1743 instruct loadV4(vecS dst, memory mem) %{
kvn@3882 1744 predicate(n->as_LoadVector()->memory_size() == 4);
kvn@3882 1745 match(Set dst (LoadVector mem));
kvn@3882 1746 ins_cost(125);
kvn@3882 1747 format %{ "movd $dst,$mem\t! load vector (4 bytes)" %}
kvn@3882 1748 ins_encode %{
kvn@3882 1749 __ movdl($dst$$XMMRegister, $mem$$Address);
kvn@3882 1750 %}
kvn@3882 1751 ins_pipe( pipe_slow );
kvn@3882 1752 %}
kvn@3882 1753
kvn@3882 1754 // Load vectors (8 bytes long)
kvn@3882 1755 instruct loadV8(vecD dst, memory mem) %{
kvn@3882 1756 predicate(n->as_LoadVector()->memory_size() == 8);
kvn@3882 1757 match(Set dst (LoadVector mem));
kvn@3882 1758 ins_cost(125);
kvn@3882 1759 format %{ "movq $dst,$mem\t! load vector (8 bytes)" %}
kvn@3882 1760 ins_encode %{
kvn@3882 1761 __ movq($dst$$XMMRegister, $mem$$Address);
kvn@3882 1762 %}
kvn@3882 1763 ins_pipe( pipe_slow );
kvn@3882 1764 %}
kvn@3882 1765
kvn@3882 1766 // Load vectors (16 bytes long)
kvn@3882 1767 instruct loadV16(vecX dst, memory mem) %{
kvn@3882 1768 predicate(n->as_LoadVector()->memory_size() == 16);
kvn@3882 1769 match(Set dst (LoadVector mem));
kvn@3882 1770 ins_cost(125);
kvn@3882 1771 format %{ "movdqu $dst,$mem\t! load vector (16 bytes)" %}
kvn@3882 1772 ins_encode %{
kvn@3882 1773 __ movdqu($dst$$XMMRegister, $mem$$Address);
kvn@3882 1774 %}
kvn@3882 1775 ins_pipe( pipe_slow );
kvn@3882 1776 %}
kvn@3882 1777
kvn@3882 1778 // Load vectors (32 bytes long)
kvn@3882 1779 instruct loadV32(vecY dst, memory mem) %{
kvn@3882 1780 predicate(n->as_LoadVector()->memory_size() == 32);
kvn@3882 1781 match(Set dst (LoadVector mem));
kvn@3882 1782 ins_cost(125);
kvn@3882 1783 format %{ "vmovdqu $dst,$mem\t! load vector (32 bytes)" %}
kvn@3882 1784 ins_encode %{
kvn@3882 1785 __ vmovdqu($dst$$XMMRegister, $mem$$Address);
kvn@3882 1786 %}
kvn@3882 1787 ins_pipe( pipe_slow );
kvn@3882 1788 %}
kvn@3882 1789
kvn@3882 1790 // Store vectors
kvn@3882 1791 instruct storeV4(memory mem, vecS src) %{
kvn@3882 1792 predicate(n->as_StoreVector()->memory_size() == 4);
kvn@3882 1793 match(Set mem (StoreVector mem src));
kvn@3882 1794 ins_cost(145);
kvn@3882 1795 format %{ "movd $mem,$src\t! store vector (4 bytes)" %}
kvn@3882 1796 ins_encode %{
kvn@3882 1797 __ movdl($mem$$Address, $src$$XMMRegister);
kvn@3882 1798 %}
kvn@3882 1799 ins_pipe( pipe_slow );
kvn@3882 1800 %}
kvn@3882 1801
kvn@3882 1802 instruct storeV8(memory mem, vecD src) %{
kvn@3882 1803 predicate(n->as_StoreVector()->memory_size() == 8);
kvn@3882 1804 match(Set mem (StoreVector mem src));
kvn@3882 1805 ins_cost(145);
kvn@3882 1806 format %{ "movq $mem,$src\t! store vector (8 bytes)" %}
kvn@3882 1807 ins_encode %{
kvn@3882 1808 __ movq($mem$$Address, $src$$XMMRegister);
kvn@3882 1809 %}
kvn@3882 1810 ins_pipe( pipe_slow );
kvn@3882 1811 %}
kvn@3882 1812
kvn@3882 1813 instruct storeV16(memory mem, vecX src) %{
kvn@3882 1814 predicate(n->as_StoreVector()->memory_size() == 16);
kvn@3882 1815 match(Set mem (StoreVector mem src));
kvn@3882 1816 ins_cost(145);
kvn@3882 1817 format %{ "movdqu $mem,$src\t! store vector (16 bytes)" %}
kvn@3882 1818 ins_encode %{
kvn@3882 1819 __ movdqu($mem$$Address, $src$$XMMRegister);
kvn@3882 1820 %}
kvn@3882 1821 ins_pipe( pipe_slow );
kvn@3882 1822 %}
kvn@3882 1823
kvn@3882 1824 instruct storeV32(memory mem, vecY src) %{
kvn@3882 1825 predicate(n->as_StoreVector()->memory_size() == 32);
kvn@3882 1826 match(Set mem (StoreVector mem src));
kvn@3882 1827 ins_cost(145);
kvn@3882 1828 format %{ "vmovdqu $mem,$src\t! store vector (32 bytes)" %}
kvn@3882 1829 ins_encode %{
kvn@3882 1830 __ vmovdqu($mem$$Address, $src$$XMMRegister);
kvn@3882 1831 %}
kvn@3882 1832 ins_pipe( pipe_slow );
kvn@3882 1833 %}
kvn@3882 1834
kvn@3882 1835 // Replicate byte scalar to be vector
kvn@3882 1836 instruct Repl4B(vecS dst, rRegI src) %{
kvn@3882 1837 predicate(n->as_Vector()->length() == 4);
kvn@3882 1838 match(Set dst (ReplicateB src));
kvn@3882 1839 format %{ "movd $dst,$src\n\t"
kvn@3882 1840 "punpcklbw $dst,$dst\n\t"
kvn@3882 1841 "pshuflw $dst,$dst,0x00\t! replicate4B" %}
kvn@3882 1842 ins_encode %{
kvn@3882 1843 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 1844 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1845 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 1846 %}
kvn@3882 1847 ins_pipe( pipe_slow );
kvn@3882 1848 %}
kvn@3882 1849
kvn@3882 1850 instruct Repl8B(vecD dst, rRegI src) %{
kvn@3882 1851 predicate(n->as_Vector()->length() == 8);
kvn@3882 1852 match(Set dst (ReplicateB src));
kvn@3882 1853 format %{ "movd $dst,$src\n\t"
kvn@3882 1854 "punpcklbw $dst,$dst\n\t"
kvn@3882 1855 "pshuflw $dst,$dst,0x00\t! replicate8B" %}
kvn@3882 1856 ins_encode %{
kvn@3882 1857 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 1858 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1859 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 1860 %}
kvn@3882 1861 ins_pipe( pipe_slow );
kvn@3882 1862 %}
kvn@3882 1863
kvn@3882 1864 instruct Repl16B(vecX dst, rRegI src) %{
kvn@3882 1865 predicate(n->as_Vector()->length() == 16);
kvn@3882 1866 match(Set dst (ReplicateB src));
kvn@3882 1867 format %{ "movd $dst,$src\n\t"
kvn@3882 1868 "punpcklbw $dst,$dst\n\t"
kvn@3882 1869 "pshuflw $dst,$dst,0x00\n\t"
kvn@3929 1870 "punpcklqdq $dst,$dst\t! replicate16B" %}
kvn@3882 1871 ins_encode %{
kvn@3882 1872 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 1873 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1874 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 1875 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1876 %}
kvn@3882 1877 ins_pipe( pipe_slow );
kvn@3882 1878 %}
kvn@3882 1879
kvn@3882 1880 instruct Repl32B(vecY dst, rRegI src) %{
kvn@3882 1881 predicate(n->as_Vector()->length() == 32);
kvn@3882 1882 match(Set dst (ReplicateB src));
kvn@3882 1883 format %{ "movd $dst,$src\n\t"
kvn@3882 1884 "punpcklbw $dst,$dst\n\t"
kvn@3882 1885 "pshuflw $dst,$dst,0x00\n\t"
kvn@3929 1886 "punpcklqdq $dst,$dst\n\t"
kvn@3929 1887 "vinserti128h $dst,$dst,$dst\t! replicate32B" %}
kvn@3882 1888 ins_encode %{
kvn@3882 1889 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 1890 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1891 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 1892 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 1893 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1894 %}
kvn@3882 1895 ins_pipe( pipe_slow );
kvn@3882 1896 %}
kvn@3882 1897
kvn@3882 1898 // Replicate byte scalar immediate to be vector by loading from const table.
kvn@3882 1899 instruct Repl4B_imm(vecS dst, immI con) %{
kvn@3882 1900 predicate(n->as_Vector()->length() == 4);
kvn@3882 1901 match(Set dst (ReplicateB con));
kvn@3929 1902 format %{ "movdl $dst,[$constantaddress]\t! replicate4B($con)" %}
kvn@3882 1903 ins_encode %{
kvn@3929 1904 __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 1)));
kvn@3882 1905 %}
kvn@3882 1906 ins_pipe( pipe_slow );
kvn@3882 1907 %}
kvn@3882 1908
kvn@3882 1909 instruct Repl8B_imm(vecD dst, immI con) %{
kvn@3882 1910 predicate(n->as_Vector()->length() == 8);
kvn@3882 1911 match(Set dst (ReplicateB con));
kvn@3929 1912 format %{ "movq $dst,[$constantaddress]\t! replicate8B($con)" %}
kvn@3882 1913 ins_encode %{
kvn@3929 1914 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
kvn@3882 1915 %}
kvn@3882 1916 ins_pipe( pipe_slow );
kvn@3882 1917 %}
kvn@3882 1918
kvn@3882 1919 instruct Repl16B_imm(vecX dst, immI con) %{
kvn@3882 1920 predicate(n->as_Vector()->length() == 16);
kvn@3882 1921 match(Set dst (ReplicateB con));
kvn@3929 1922 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 1923 "punpcklqdq $dst,$dst\t! replicate16B($con)" %}
kvn@3882 1924 ins_encode %{
kvn@3929 1925 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
kvn@3929 1926 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1927 %}
kvn@3882 1928 ins_pipe( pipe_slow );
kvn@3882 1929 %}
kvn@3882 1930
kvn@3882 1931 instruct Repl32B_imm(vecY dst, immI con) %{
kvn@3882 1932 predicate(n->as_Vector()->length() == 32);
kvn@3882 1933 match(Set dst (ReplicateB con));
kvn@3929 1934 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 1935 "punpcklqdq $dst,$dst\n\t"
kvn@3929 1936 "vinserti128h $dst,$dst,$dst\t! lreplicate32B($con)" %}
kvn@3882 1937 ins_encode %{
kvn@3929 1938 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
kvn@3929 1939 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 1940 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1941 %}
kvn@3882 1942 ins_pipe( pipe_slow );
kvn@3882 1943 %}
kvn@3882 1944
kvn@3882 1945 // Replicate byte scalar zero to be vector
kvn@3882 1946 instruct Repl4B_zero(vecS dst, immI0 zero) %{
kvn@3882 1947 predicate(n->as_Vector()->length() == 4);
kvn@3882 1948 match(Set dst (ReplicateB zero));
kvn@3882 1949 format %{ "pxor $dst,$dst\t! replicate4B zero" %}
kvn@3882 1950 ins_encode %{
kvn@3882 1951 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1952 %}
kvn@3882 1953 ins_pipe( fpu_reg_reg );
kvn@3882 1954 %}
kvn@3882 1955
kvn@3882 1956 instruct Repl8B_zero(vecD dst, immI0 zero) %{
kvn@3882 1957 predicate(n->as_Vector()->length() == 8);
kvn@3882 1958 match(Set dst (ReplicateB zero));
kvn@3882 1959 format %{ "pxor $dst,$dst\t! replicate8B zero" %}
kvn@3882 1960 ins_encode %{
kvn@3882 1961 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1962 %}
kvn@3882 1963 ins_pipe( fpu_reg_reg );
kvn@3882 1964 %}
kvn@3882 1965
kvn@3882 1966 instruct Repl16B_zero(vecX dst, immI0 zero) %{
kvn@3882 1967 predicate(n->as_Vector()->length() == 16);
kvn@3882 1968 match(Set dst (ReplicateB zero));
kvn@3882 1969 format %{ "pxor $dst,$dst\t! replicate16B zero" %}
kvn@3882 1970 ins_encode %{
kvn@3882 1971 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 1972 %}
kvn@3882 1973 ins_pipe( fpu_reg_reg );
kvn@3882 1974 %}
kvn@3882 1975
kvn@3882 1976 instruct Repl32B_zero(vecY dst, immI0 zero) %{
kvn@3882 1977 predicate(n->as_Vector()->length() == 32);
kvn@3882 1978 match(Set dst (ReplicateB zero));
kvn@3929 1979 format %{ "vpxor $dst,$dst,$dst\t! replicate32B zero" %}
kvn@3882 1980 ins_encode %{
kvn@3882 1981 // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
kvn@3882 1982 bool vector256 = true;
kvn@3929 1983 __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 1984 %}
kvn@3882 1985 ins_pipe( fpu_reg_reg );
kvn@3882 1986 %}
kvn@3882 1987
kvn@3882 1988 // Replicate char/short (2 byte) scalar to be vector
kvn@3882 1989 instruct Repl2S(vecS dst, rRegI src) %{
kvn@3882 1990 predicate(n->as_Vector()->length() == 2);
kvn@3882 1991 match(Set dst (ReplicateS src));
kvn@3882 1992 format %{ "movd $dst,$src\n\t"
kvn@3882 1993 "pshuflw $dst,$dst,0x00\t! replicate2S" %}
kvn@3882 1994 ins_encode %{
kvn@3882 1995 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 1996 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 1997 %}
kvn@3882 1998 ins_pipe( fpu_reg_reg );
kvn@3882 1999 %}
kvn@3882 2000
kvn@3882 2001 instruct Repl4S(vecD dst, rRegI src) %{
kvn@3882 2002 predicate(n->as_Vector()->length() == 4);
kvn@3882 2003 match(Set dst (ReplicateS src));
kvn@3882 2004 format %{ "movd $dst,$src\n\t"
kvn@3882 2005 "pshuflw $dst,$dst,0x00\t! replicate4S" %}
kvn@3882 2006 ins_encode %{
kvn@3882 2007 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2008 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 2009 %}
kvn@3882 2010 ins_pipe( fpu_reg_reg );
kvn@3882 2011 %}
kvn@3882 2012
kvn@3882 2013 instruct Repl8S(vecX dst, rRegI src) %{
kvn@3882 2014 predicate(n->as_Vector()->length() == 8);
kvn@3882 2015 match(Set dst (ReplicateS src));
kvn@3882 2016 format %{ "movd $dst,$src\n\t"
kvn@3882 2017 "pshuflw $dst,$dst,0x00\n\t"
kvn@3929 2018 "punpcklqdq $dst,$dst\t! replicate8S" %}
kvn@3882 2019 ins_encode %{
kvn@3882 2020 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2021 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 2022 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2023 %}
kvn@3882 2024 ins_pipe( pipe_slow );
kvn@3882 2025 %}
kvn@3882 2026
kvn@3882 2027 instruct Repl16S(vecY dst, rRegI src) %{
kvn@3882 2028 predicate(n->as_Vector()->length() == 16);
kvn@3882 2029 match(Set dst (ReplicateS src));
kvn@3882 2030 format %{ "movd $dst,$src\n\t"
kvn@3882 2031 "pshuflw $dst,$dst,0x00\n\t"
kvn@3929 2032 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2033 "vinserti128h $dst,$dst,$dst\t! replicate16S" %}
kvn@3882 2034 ins_encode %{
kvn@3882 2035 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2036 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 2037 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2038 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2039 %}
kvn@3882 2040 ins_pipe( pipe_slow );
kvn@3882 2041 %}
kvn@3882 2042
kvn@3882 2043 // Replicate char/short (2 byte) scalar immediate to be vector by loading from const table.
kvn@3882 2044 instruct Repl2S_imm(vecS dst, immI con) %{
kvn@3882 2045 predicate(n->as_Vector()->length() == 2);
kvn@3882 2046 match(Set dst (ReplicateS con));
kvn@3929 2047 format %{ "movdl $dst,[$constantaddress]\t! replicate2S($con)" %}
kvn@3882 2048 ins_encode %{
kvn@3929 2049 __ movdl($dst$$XMMRegister, $constantaddress(replicate4_imm($con$$constant, 2)));
kvn@3882 2050 %}
kvn@3882 2051 ins_pipe( fpu_reg_reg );
kvn@3882 2052 %}
kvn@3882 2053
kvn@3882 2054 instruct Repl4S_imm(vecD dst, immI con) %{
kvn@3882 2055 predicate(n->as_Vector()->length() == 4);
kvn@3882 2056 match(Set dst (ReplicateS con));
kvn@3929 2057 format %{ "movq $dst,[$constantaddress]\t! replicate4S($con)" %}
kvn@3882 2058 ins_encode %{
kvn@3929 2059 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
kvn@3882 2060 %}
kvn@3882 2061 ins_pipe( fpu_reg_reg );
kvn@3882 2062 %}
kvn@3882 2063
kvn@3882 2064 instruct Repl8S_imm(vecX dst, immI con) %{
kvn@3882 2065 predicate(n->as_Vector()->length() == 8);
kvn@3882 2066 match(Set dst (ReplicateS con));
kvn@3929 2067 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 2068 "punpcklqdq $dst,$dst\t! replicate8S($con)" %}
kvn@3882 2069 ins_encode %{
kvn@3929 2070 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
kvn@3929 2071 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2072 %}
kvn@3882 2073 ins_pipe( pipe_slow );
kvn@3882 2074 %}
kvn@3882 2075
kvn@3882 2076 instruct Repl16S_imm(vecY dst, immI con) %{
kvn@3882 2077 predicate(n->as_Vector()->length() == 16);
kvn@3882 2078 match(Set dst (ReplicateS con));
kvn@3929 2079 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 2080 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2081 "vinserti128h $dst,$dst,$dst\t! replicate16S($con)" %}
kvn@3882 2082 ins_encode %{
kvn@3929 2083 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
kvn@3929 2084 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2085 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2086 %}
kvn@3882 2087 ins_pipe( pipe_slow );
kvn@3882 2088 %}
kvn@3882 2089
kvn@3882 2090 // Replicate char/short (2 byte) scalar zero to be vector
kvn@3882 2091 instruct Repl2S_zero(vecS dst, immI0 zero) %{
kvn@3882 2092 predicate(n->as_Vector()->length() == 2);
kvn@3882 2093 match(Set dst (ReplicateS zero));
kvn@3882 2094 format %{ "pxor $dst,$dst\t! replicate2S zero" %}
kvn@3882 2095 ins_encode %{
kvn@3882 2096 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2097 %}
kvn@3882 2098 ins_pipe( fpu_reg_reg );
kvn@3882 2099 %}
kvn@3882 2100
kvn@3882 2101 instruct Repl4S_zero(vecD dst, immI0 zero) %{
kvn@3882 2102 predicate(n->as_Vector()->length() == 4);
kvn@3882 2103 match(Set dst (ReplicateS zero));
kvn@3882 2104 format %{ "pxor $dst,$dst\t! replicate4S zero" %}
kvn@3882 2105 ins_encode %{
kvn@3882 2106 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2107 %}
kvn@3882 2108 ins_pipe( fpu_reg_reg );
kvn@3882 2109 %}
kvn@3882 2110
kvn@3882 2111 instruct Repl8S_zero(vecX dst, immI0 zero) %{
kvn@3882 2112 predicate(n->as_Vector()->length() == 8);
kvn@3882 2113 match(Set dst (ReplicateS zero));
kvn@3882 2114 format %{ "pxor $dst,$dst\t! replicate8S zero" %}
kvn@3882 2115 ins_encode %{
kvn@3882 2116 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2117 %}
kvn@3882 2118 ins_pipe( fpu_reg_reg );
kvn@3882 2119 %}
kvn@3882 2120
kvn@3882 2121 instruct Repl16S_zero(vecY dst, immI0 zero) %{
kvn@3882 2122 predicate(n->as_Vector()->length() == 16);
kvn@3882 2123 match(Set dst (ReplicateS zero));
kvn@3929 2124 format %{ "vpxor $dst,$dst,$dst\t! replicate16S zero" %}
kvn@3882 2125 ins_encode %{
kvn@3882 2126 // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
kvn@3882 2127 bool vector256 = true;
kvn@3929 2128 __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 2129 %}
kvn@3882 2130 ins_pipe( fpu_reg_reg );
kvn@3882 2131 %}
kvn@3882 2132
kvn@3882 2133 // Replicate integer (4 byte) scalar to be vector
kvn@3882 2134 instruct Repl2I(vecD dst, rRegI src) %{
kvn@3882 2135 predicate(n->as_Vector()->length() == 2);
kvn@3882 2136 match(Set dst (ReplicateI src));
kvn@3882 2137 format %{ "movd $dst,$src\n\t"
kvn@3882 2138 "pshufd $dst,$dst,0x00\t! replicate2I" %}
kvn@3882 2139 ins_encode %{
kvn@3882 2140 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2141 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 2142 %}
kvn@3882 2143 ins_pipe( fpu_reg_reg );
kvn@3882 2144 %}
kvn@3882 2145
kvn@3882 2146 instruct Repl4I(vecX dst, rRegI src) %{
kvn@3882 2147 predicate(n->as_Vector()->length() == 4);
kvn@3882 2148 match(Set dst (ReplicateI src));
kvn@3882 2149 format %{ "movd $dst,$src\n\t"
kvn@3882 2150 "pshufd $dst,$dst,0x00\t! replicate4I" %}
kvn@3882 2151 ins_encode %{
kvn@3882 2152 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2153 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 2154 %}
kvn@3882 2155 ins_pipe( pipe_slow );
kvn@3882 2156 %}
kvn@3882 2157
kvn@3882 2158 instruct Repl8I(vecY dst, rRegI src) %{
kvn@3882 2159 predicate(n->as_Vector()->length() == 8);
kvn@3882 2160 match(Set dst (ReplicateI src));
kvn@3882 2161 format %{ "movd $dst,$src\n\t"
kvn@3882 2162 "pshufd $dst,$dst,0x00\n\t"
kvn@3929 2163 "vinserti128h $dst,$dst,$dst\t! replicate8I" %}
kvn@3882 2164 ins_encode %{
kvn@3882 2165 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2166 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 2167 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2168 %}
kvn@3882 2169 ins_pipe( pipe_slow );
kvn@3882 2170 %}
kvn@3882 2171
kvn@3882 2172 // Replicate integer (4 byte) scalar immediate to be vector by loading from const table.
kvn@3882 2173 instruct Repl2I_imm(vecD dst, immI con) %{
kvn@3882 2174 predicate(n->as_Vector()->length() == 2);
kvn@3882 2175 match(Set dst (ReplicateI con));
kvn@3929 2176 format %{ "movq $dst,[$constantaddress]\t! replicate2I($con)" %}
kvn@3882 2177 ins_encode %{
kvn@3929 2178 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
kvn@3882 2179 %}
kvn@3882 2180 ins_pipe( fpu_reg_reg );
kvn@3882 2181 %}
kvn@3882 2182
kvn@3882 2183 instruct Repl4I_imm(vecX dst, immI con) %{
kvn@3882 2184 predicate(n->as_Vector()->length() == 4);
kvn@3882 2185 match(Set dst (ReplicateI con));
kvn@3929 2186 format %{ "movq $dst,[$constantaddress]\t! replicate4I($con)\n\t"
kvn@3929 2187 "punpcklqdq $dst,$dst" %}
kvn@3882 2188 ins_encode %{
kvn@3929 2189 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
kvn@3929 2190 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2191 %}
kvn@3882 2192 ins_pipe( pipe_slow );
kvn@3882 2193 %}
kvn@3882 2194
kvn@3882 2195 instruct Repl8I_imm(vecY dst, immI con) %{
kvn@3882 2196 predicate(n->as_Vector()->length() == 8);
kvn@3882 2197 match(Set dst (ReplicateI con));
kvn@3929 2198 format %{ "movq $dst,[$constantaddress]\t! replicate8I($con)\n\t"
kvn@3929 2199 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2200 "vinserti128h $dst,$dst,$dst" %}
kvn@3882 2201 ins_encode %{
kvn@3929 2202 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
kvn@3929 2203 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2204 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2205 %}
kvn@3882 2206 ins_pipe( pipe_slow );
kvn@3882 2207 %}
kvn@3882 2208
kvn@3882 2209 // Integer could be loaded into xmm register directly from memory.
kvn@3882 2210 instruct Repl2I_mem(vecD dst, memory mem) %{
kvn@3882 2211 predicate(n->as_Vector()->length() == 2);
kvn@3929 2212 match(Set dst (ReplicateI (LoadI mem)));
kvn@3882 2213 format %{ "movd $dst,$mem\n\t"
kvn@3882 2214 "pshufd $dst,$dst,0x00\t! replicate2I" %}
kvn@3882 2215 ins_encode %{
kvn@3882 2216 __ movdl($dst$$XMMRegister, $mem$$Address);
kvn@3882 2217 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 2218 %}
kvn@3882 2219 ins_pipe( fpu_reg_reg );
kvn@3882 2220 %}
kvn@3882 2221
kvn@3882 2222 instruct Repl4I_mem(vecX dst, memory mem) %{
kvn@3882 2223 predicate(n->as_Vector()->length() == 4);
kvn@3929 2224 match(Set dst (ReplicateI (LoadI mem)));
kvn@3882 2225 format %{ "movd $dst,$mem\n\t"
kvn@3882 2226 "pshufd $dst,$dst,0x00\t! replicate4I" %}
kvn@3882 2227 ins_encode %{
kvn@3882 2228 __ movdl($dst$$XMMRegister, $mem$$Address);
kvn@3882 2229 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3882 2230 %}
kvn@3882 2231 ins_pipe( pipe_slow );
kvn@3882 2232 %}
kvn@3882 2233
kvn@3882 2234 instruct Repl8I_mem(vecY dst, memory mem) %{
kvn@3882 2235 predicate(n->as_Vector()->length() == 8);
kvn@3929 2236 match(Set dst (ReplicateI (LoadI mem)));
kvn@3882 2237 format %{ "movd $dst,$mem\n\t"
kvn@3882 2238 "pshufd $dst,$dst,0x00\n\t"
kvn@3929 2239 "vinserti128h $dst,$dst,$dst\t! replicate8I" %}
kvn@3882 2240 ins_encode %{
kvn@3882 2241 __ movdl($dst$$XMMRegister, $mem$$Address);
kvn@3882 2242 __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
kvn@3929 2243 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2244 %}
kvn@3882 2245 ins_pipe( pipe_slow );
kvn@3882 2246 %}
kvn@3882 2247
kvn@3882 2248 // Replicate integer (4 byte) scalar zero to be vector
kvn@3882 2249 instruct Repl2I_zero(vecD dst, immI0 zero) %{
kvn@3882 2250 predicate(n->as_Vector()->length() == 2);
kvn@3882 2251 match(Set dst (ReplicateI zero));
kvn@3882 2252 format %{ "pxor $dst,$dst\t! replicate2I" %}
kvn@3882 2253 ins_encode %{
kvn@3882 2254 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2255 %}
kvn@3882 2256 ins_pipe( fpu_reg_reg );
kvn@3882 2257 %}
kvn@3882 2258
kvn@3882 2259 instruct Repl4I_zero(vecX dst, immI0 zero) %{
kvn@3882 2260 predicate(n->as_Vector()->length() == 4);
kvn@3882 2261 match(Set dst (ReplicateI zero));
kvn@3882 2262 format %{ "pxor $dst,$dst\t! replicate4I zero)" %}
kvn@3882 2263 ins_encode %{
kvn@3882 2264 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2265 %}
kvn@3882 2266 ins_pipe( fpu_reg_reg );
kvn@3882 2267 %}
kvn@3882 2268
kvn@3882 2269 instruct Repl8I_zero(vecY dst, immI0 zero) %{
kvn@3882 2270 predicate(n->as_Vector()->length() == 8);
kvn@3882 2271 match(Set dst (ReplicateI zero));
kvn@3929 2272 format %{ "vpxor $dst,$dst,$dst\t! replicate8I zero" %}
kvn@3882 2273 ins_encode %{
kvn@3882 2274 // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
kvn@3882 2275 bool vector256 = true;
kvn@3929 2276 __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 2277 %}
kvn@3882 2278 ins_pipe( fpu_reg_reg );
kvn@3882 2279 %}
kvn@3882 2280
kvn@3882 2281 // Replicate long (8 byte) scalar to be vector
kvn@3882 2282 #ifdef _LP64
kvn@3882 2283 instruct Repl2L(vecX dst, rRegL src) %{
kvn@3882 2284 predicate(n->as_Vector()->length() == 2);
kvn@3882 2285 match(Set dst (ReplicateL src));
kvn@3882 2286 format %{ "movdq $dst,$src\n\t"
kvn@3929 2287 "punpcklqdq $dst,$dst\t! replicate2L" %}
kvn@3882 2288 ins_encode %{
kvn@3882 2289 __ movdq($dst$$XMMRegister, $src$$Register);
kvn@3929 2290 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2291 %}
kvn@3882 2292 ins_pipe( pipe_slow );
kvn@3882 2293 %}
kvn@3882 2294
kvn@3882 2295 instruct Repl4L(vecY dst, rRegL src) %{
kvn@3882 2296 predicate(n->as_Vector()->length() == 4);
kvn@3882 2297 match(Set dst (ReplicateL src));
kvn@3882 2298 format %{ "movdq $dst,$src\n\t"
kvn@3929 2299 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2300 "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
kvn@3882 2301 ins_encode %{
kvn@3882 2302 __ movdq($dst$$XMMRegister, $src$$Register);
kvn@3929 2303 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2304 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2305 %}
kvn@3882 2306 ins_pipe( pipe_slow );
kvn@3882 2307 %}
kvn@3882 2308 #else // _LP64
kvn@3882 2309 instruct Repl2L(vecX dst, eRegL src, regD tmp) %{
kvn@3882 2310 predicate(n->as_Vector()->length() == 2);
kvn@3882 2311 match(Set dst (ReplicateL src));
kvn@3882 2312 effect(TEMP dst, USE src, TEMP tmp);
kvn@3882 2313 format %{ "movdl $dst,$src.lo\n\t"
kvn@3882 2314 "movdl $tmp,$src.hi\n\t"
kvn@3882 2315 "punpckldq $dst,$tmp\n\t"
kvn@3929 2316 "punpcklqdq $dst,$dst\t! replicate2L"%}
kvn@3882 2317 ins_encode %{
kvn@3882 2318 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2319 __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
kvn@3882 2320 __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
kvn@3929 2321 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2322 %}
kvn@3882 2323 ins_pipe( pipe_slow );
kvn@3882 2324 %}
kvn@3882 2325
kvn@3882 2326 instruct Repl4L(vecY dst, eRegL src, regD tmp) %{
kvn@3882 2327 predicate(n->as_Vector()->length() == 4);
kvn@3882 2328 match(Set dst (ReplicateL src));
kvn@3882 2329 effect(TEMP dst, USE src, TEMP tmp);
kvn@3882 2330 format %{ "movdl $dst,$src.lo\n\t"
kvn@3882 2331 "movdl $tmp,$src.hi\n\t"
kvn@3882 2332 "punpckldq $dst,$tmp\n\t"
kvn@3929 2333 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2334 "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
kvn@3882 2335 ins_encode %{
kvn@3882 2336 __ movdl($dst$$XMMRegister, $src$$Register);
kvn@3882 2337 __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
kvn@3882 2338 __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
kvn@3929 2339 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2340 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2341 %}
kvn@3882 2342 ins_pipe( pipe_slow );
kvn@3882 2343 %}
kvn@3882 2344 #endif // _LP64
kvn@3882 2345
kvn@3882 2346 // Replicate long (8 byte) scalar immediate to be vector by loading from const table.
kvn@3882 2347 instruct Repl2L_imm(vecX dst, immL con) %{
kvn@3882 2348 predicate(n->as_Vector()->length() == 2);
kvn@3882 2349 match(Set dst (ReplicateL con));
kvn@3929 2350 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 2351 "punpcklqdq $dst,$dst\t! replicate2L($con)" %}
kvn@3882 2352 ins_encode %{
kvn@3929 2353 __ movq($dst$$XMMRegister, $constantaddress($con));
kvn@3929 2354 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2355 %}
kvn@3882 2356 ins_pipe( pipe_slow );
kvn@3882 2357 %}
kvn@3882 2358
kvn@3882 2359 instruct Repl4L_imm(vecY dst, immL con) %{
kvn@3882 2360 predicate(n->as_Vector()->length() == 4);
kvn@3882 2361 match(Set dst (ReplicateL con));
kvn@3929 2362 format %{ "movq $dst,[$constantaddress]\n\t"
kvn@3929 2363 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2364 "vinserti128h $dst,$dst,$dst\t! replicate4L($con)" %}
kvn@3882 2365 ins_encode %{
kvn@3929 2366 __ movq($dst$$XMMRegister, $constantaddress($con));
kvn@3929 2367 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2368 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2369 %}
kvn@3882 2370 ins_pipe( pipe_slow );
kvn@3882 2371 %}
kvn@3882 2372
kvn@3882 2373 // Long could be loaded into xmm register directly from memory.
kvn@3882 2374 instruct Repl2L_mem(vecX dst, memory mem) %{
kvn@3882 2375 predicate(n->as_Vector()->length() == 2);
kvn@3929 2376 match(Set dst (ReplicateL (LoadL mem)));
kvn@3882 2377 format %{ "movq $dst,$mem\n\t"
kvn@3929 2378 "punpcklqdq $dst,$dst\t! replicate2L" %}
kvn@3882 2379 ins_encode %{
kvn@3882 2380 __ movq($dst$$XMMRegister, $mem$$Address);
kvn@3929 2381 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2382 %}
kvn@3882 2383 ins_pipe( pipe_slow );
kvn@3882 2384 %}
kvn@3882 2385
kvn@3882 2386 instruct Repl4L_mem(vecY dst, memory mem) %{
kvn@3882 2387 predicate(n->as_Vector()->length() == 4);
kvn@3929 2388 match(Set dst (ReplicateL (LoadL mem)));
kvn@3882 2389 format %{ "movq $dst,$mem\n\t"
kvn@3929 2390 "punpcklqdq $dst,$dst\n\t"
kvn@3929 2391 "vinserti128h $dst,$dst,$dst\t! replicate4L" %}
kvn@3882 2392 ins_encode %{
kvn@3882 2393 __ movq($dst$$XMMRegister, $mem$$Address);
kvn@3929 2394 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3929 2395 __ vinserti128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2396 %}
kvn@3882 2397 ins_pipe( pipe_slow );
kvn@3882 2398 %}
kvn@3882 2399
kvn@3882 2400 // Replicate long (8 byte) scalar zero to be vector
kvn@3882 2401 instruct Repl2L_zero(vecX dst, immL0 zero) %{
kvn@3882 2402 predicate(n->as_Vector()->length() == 2);
kvn@3882 2403 match(Set dst (ReplicateL zero));
kvn@3882 2404 format %{ "pxor $dst,$dst\t! replicate2L zero" %}
kvn@3882 2405 ins_encode %{
kvn@3882 2406 __ pxor($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2407 %}
kvn@3882 2408 ins_pipe( fpu_reg_reg );
kvn@3882 2409 %}
kvn@3882 2410
kvn@3882 2411 instruct Repl4L_zero(vecY dst, immL0 zero) %{
kvn@3882 2412 predicate(n->as_Vector()->length() == 4);
kvn@3882 2413 match(Set dst (ReplicateL zero));
kvn@3929 2414 format %{ "vpxor $dst,$dst,$dst\t! replicate4L zero" %}
kvn@3882 2415 ins_encode %{
kvn@3882 2416 // Use vxorpd since AVX does not have vpxor for 256-bit (AVX2 will have it).
kvn@3882 2417 bool vector256 = true;
kvn@3929 2418 __ vpxor($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 2419 %}
kvn@3882 2420 ins_pipe( fpu_reg_reg );
kvn@3882 2421 %}
kvn@3882 2422
kvn@3882 2423 // Replicate float (4 byte) scalar to be vector
kvn@3882 2424 instruct Repl2F(vecD dst, regF src) %{
kvn@3882 2425 predicate(n->as_Vector()->length() == 2);
kvn@3882 2426 match(Set dst (ReplicateF src));
kvn@3882 2427 format %{ "pshufd $dst,$dst,0x00\t! replicate2F" %}
kvn@3882 2428 ins_encode %{
kvn@3882 2429 __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
kvn@3882 2430 %}
kvn@3882 2431 ins_pipe( fpu_reg_reg );
kvn@3882 2432 %}
kvn@3882 2433
kvn@3882 2434 instruct Repl4F(vecX dst, regF src) %{
kvn@3882 2435 predicate(n->as_Vector()->length() == 4);
kvn@3882 2436 match(Set dst (ReplicateF src));
kvn@3882 2437 format %{ "pshufd $dst,$dst,0x00\t! replicate4F" %}
kvn@3882 2438 ins_encode %{
kvn@3882 2439 __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
kvn@3882 2440 %}
kvn@3882 2441 ins_pipe( pipe_slow );
kvn@3882 2442 %}
kvn@3882 2443
kvn@3882 2444 instruct Repl8F(vecY dst, regF src) %{
kvn@3882 2445 predicate(n->as_Vector()->length() == 8);
kvn@3882 2446 match(Set dst (ReplicateF src));
kvn@3882 2447 format %{ "pshufd $dst,$src,0x00\n\t"
kvn@3882 2448 "vinsertf128h $dst,$dst,$dst\t! replicate8F" %}
kvn@3882 2449 ins_encode %{
kvn@3882 2450 __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
kvn@3882 2451 __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2452 %}
kvn@3882 2453 ins_pipe( pipe_slow );
kvn@3882 2454 %}
kvn@3882 2455
kvn@3882 2456 // Replicate float (4 byte) scalar zero to be vector
kvn@3882 2457 instruct Repl2F_zero(vecD dst, immF0 zero) %{
kvn@3882 2458 predicate(n->as_Vector()->length() == 2);
kvn@3882 2459 match(Set dst (ReplicateF zero));
kvn@3882 2460 format %{ "xorps $dst,$dst\t! replicate2F zero" %}
kvn@3882 2461 ins_encode %{
kvn@3882 2462 __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2463 %}
kvn@3882 2464 ins_pipe( fpu_reg_reg );
kvn@3882 2465 %}
kvn@3882 2466
kvn@3882 2467 instruct Repl4F_zero(vecX dst, immF0 zero) %{
kvn@3882 2468 predicate(n->as_Vector()->length() == 4);
kvn@3882 2469 match(Set dst (ReplicateF zero));
kvn@3882 2470 format %{ "xorps $dst,$dst\t! replicate4F zero" %}
kvn@3882 2471 ins_encode %{
kvn@3882 2472 __ xorps($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2473 %}
kvn@3882 2474 ins_pipe( fpu_reg_reg );
kvn@3882 2475 %}
kvn@3882 2476
kvn@3882 2477 instruct Repl8F_zero(vecY dst, immF0 zero) %{
kvn@3882 2478 predicate(n->as_Vector()->length() == 8);
kvn@3882 2479 match(Set dst (ReplicateF zero));
kvn@3882 2480 format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %}
kvn@3882 2481 ins_encode %{
kvn@3882 2482 bool vector256 = true;
kvn@3882 2483 __ vxorps($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 2484 %}
kvn@3882 2485 ins_pipe( fpu_reg_reg );
kvn@3882 2486 %}
kvn@3882 2487
kvn@3882 2488 // Replicate double (8 bytes) scalar to be vector
kvn@3882 2489 instruct Repl2D(vecX dst, regD src) %{
kvn@3882 2490 predicate(n->as_Vector()->length() == 2);
kvn@3882 2491 match(Set dst (ReplicateD src));
kvn@3882 2492 format %{ "pshufd $dst,$src,0x44\t! replicate2D" %}
kvn@3882 2493 ins_encode %{
kvn@3882 2494 __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
kvn@3882 2495 %}
kvn@3882 2496 ins_pipe( pipe_slow );
kvn@3882 2497 %}
kvn@3882 2498
kvn@3882 2499 instruct Repl4D(vecY dst, regD src) %{
kvn@3882 2500 predicate(n->as_Vector()->length() == 4);
kvn@3882 2501 match(Set dst (ReplicateD src));
kvn@3882 2502 format %{ "pshufd $dst,$src,0x44\n\t"
kvn@3882 2503 "vinsertf128h $dst,$dst,$dst\t! replicate4D" %}
kvn@3882 2504 ins_encode %{
kvn@3882 2505 __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
kvn@3882 2506 __ vinsertf128h($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2507 %}
kvn@3882 2508 ins_pipe( pipe_slow );
kvn@3882 2509 %}
kvn@3882 2510
kvn@3882 2511 // Replicate double (8 byte) scalar zero to be vector
kvn@3882 2512 instruct Repl2D_zero(vecX dst, immD0 zero) %{
kvn@3882 2513 predicate(n->as_Vector()->length() == 2);
kvn@3882 2514 match(Set dst (ReplicateD zero));
kvn@3882 2515 format %{ "xorpd $dst,$dst\t! replicate2D zero" %}
kvn@3882 2516 ins_encode %{
kvn@3882 2517 __ xorpd($dst$$XMMRegister, $dst$$XMMRegister);
kvn@3882 2518 %}
kvn@3882 2519 ins_pipe( fpu_reg_reg );
kvn@3882 2520 %}
kvn@3882 2521
kvn@3882 2522 instruct Repl4D_zero(vecY dst, immD0 zero) %{
kvn@3882 2523 predicate(n->as_Vector()->length() == 4);
kvn@3882 2524 match(Set dst (ReplicateD zero));
kvn@3882 2525 format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %}
kvn@3882 2526 ins_encode %{
kvn@3882 2527 bool vector256 = true;
kvn@3882 2528 __ vxorpd($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, vector256);
kvn@3882 2529 %}
kvn@3882 2530 ins_pipe( fpu_reg_reg );
kvn@3882 2531 %}
kvn@3882 2532
kvn@4001 2533 // ====================VECTOR ARITHMETIC=======================================
kvn@4001 2534
kvn@4001 2535 // --------------------------------- ADD --------------------------------------
kvn@4001 2536
kvn@4001 2537 // Bytes vector add
kvn@4001 2538 instruct vadd4B(vecS dst, vecS src) %{
kvn@4001 2539 predicate(n->as_Vector()->length() == 4);
kvn@4001 2540 match(Set dst (AddVB dst src));
kvn@4001 2541 format %{ "paddb $dst,$src\t! add packed4B" %}
kvn@4001 2542 ins_encode %{
kvn@4001 2543 __ paddb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2544 %}
kvn@4001 2545 ins_pipe( pipe_slow );
kvn@4001 2546 %}
kvn@4001 2547
kvn@4001 2548 instruct vadd4B_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 2549 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2550 match(Set dst (AddVB src1 src2));
kvn@4001 2551 format %{ "vpaddb $dst,$src1,$src2\t! add packed4B" %}
kvn@4001 2552 ins_encode %{
kvn@4001 2553 bool vector256 = false;
kvn@4001 2554 __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2555 %}
kvn@4001 2556 ins_pipe( pipe_slow );
kvn@4001 2557 %}
kvn@4001 2558
kvn@4001 2559 instruct vadd8B(vecD dst, vecD src) %{
kvn@4001 2560 predicate(n->as_Vector()->length() == 8);
kvn@4001 2561 match(Set dst (AddVB dst src));
kvn@4001 2562 format %{ "paddb $dst,$src\t! add packed8B" %}
kvn@4001 2563 ins_encode %{
kvn@4001 2564 __ paddb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2565 %}
kvn@4001 2566 ins_pipe( pipe_slow );
kvn@4001 2567 %}
kvn@4001 2568
kvn@4001 2569 instruct vadd8B_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 2570 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 2571 match(Set dst (AddVB src1 src2));
kvn@4001 2572 format %{ "vpaddb $dst,$src1,$src2\t! add packed8B" %}
kvn@4001 2573 ins_encode %{
kvn@4001 2574 bool vector256 = false;
kvn@4001 2575 __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2576 %}
kvn@4001 2577 ins_pipe( pipe_slow );
kvn@4001 2578 %}
kvn@4001 2579
kvn@4001 2580 instruct vadd16B(vecX dst, vecX src) %{
kvn@4001 2581 predicate(n->as_Vector()->length() == 16);
kvn@4001 2582 match(Set dst (AddVB dst src));
kvn@4001 2583 format %{ "paddb $dst,$src\t! add packed16B" %}
kvn@4001 2584 ins_encode %{
kvn@4001 2585 __ paddb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2586 %}
kvn@4001 2587 ins_pipe( pipe_slow );
kvn@4001 2588 %}
kvn@4001 2589
kvn@4001 2590 instruct vadd16B_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2591 predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
kvn@4001 2592 match(Set dst (AddVB src1 src2));
kvn@4001 2593 format %{ "vpaddb $dst,$src1,$src2\t! add packed16B" %}
kvn@4001 2594 ins_encode %{
kvn@4001 2595 bool vector256 = false;
kvn@4001 2596 __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2597 %}
kvn@4001 2598 ins_pipe( pipe_slow );
kvn@4001 2599 %}
kvn@4001 2600
kvn@4001 2601 instruct vadd16B_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2602 predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
kvn@4001 2603 match(Set dst (AddVB src (LoadVector mem)));
kvn@4001 2604 format %{ "vpaddb $dst,$src,$mem\t! add packed16B" %}
kvn@4001 2605 ins_encode %{
kvn@4001 2606 bool vector256 = false;
kvn@4001 2607 __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2608 %}
kvn@4001 2609 ins_pipe( pipe_slow );
kvn@4001 2610 %}
kvn@4001 2611
kvn@4001 2612 instruct vadd32B_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2613 predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
kvn@4001 2614 match(Set dst (AddVB src1 src2));
kvn@4001 2615 format %{ "vpaddb $dst,$src1,$src2\t! add packed32B" %}
kvn@4001 2616 ins_encode %{
kvn@4001 2617 bool vector256 = true;
kvn@4001 2618 __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2619 %}
kvn@4001 2620 ins_pipe( pipe_slow );
kvn@4001 2621 %}
kvn@4001 2622
kvn@4001 2623 instruct vadd32B_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2624 predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
kvn@4001 2625 match(Set dst (AddVB src (LoadVector mem)));
kvn@4001 2626 format %{ "vpaddb $dst,$src,$mem\t! add packed32B" %}
kvn@4001 2627 ins_encode %{
kvn@4001 2628 bool vector256 = true;
kvn@4001 2629 __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2630 %}
kvn@4001 2631 ins_pipe( pipe_slow );
kvn@4001 2632 %}
kvn@4001 2633
kvn@4001 2634 // Shorts/Chars vector add
kvn@4001 2635 instruct vadd2S(vecS dst, vecS src) %{
kvn@4001 2636 predicate(n->as_Vector()->length() == 2);
kvn@4001 2637 match(Set dst (AddVS dst src));
kvn@4001 2638 format %{ "paddw $dst,$src\t! add packed2S" %}
kvn@4001 2639 ins_encode %{
kvn@4001 2640 __ paddw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2641 %}
kvn@4001 2642 ins_pipe( pipe_slow );
kvn@4001 2643 %}
kvn@4001 2644
kvn@4001 2645 instruct vadd2S_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 2646 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2647 match(Set dst (AddVS src1 src2));
kvn@4001 2648 format %{ "vpaddw $dst,$src1,$src2\t! add packed2S" %}
kvn@4001 2649 ins_encode %{
kvn@4001 2650 bool vector256 = false;
kvn@4001 2651 __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2652 %}
kvn@4001 2653 ins_pipe( pipe_slow );
kvn@4001 2654 %}
kvn@4001 2655
kvn@4001 2656 instruct vadd4S(vecD dst, vecD src) %{
kvn@4001 2657 predicate(n->as_Vector()->length() == 4);
kvn@4001 2658 match(Set dst (AddVS dst src));
kvn@4001 2659 format %{ "paddw $dst,$src\t! add packed4S" %}
kvn@4001 2660 ins_encode %{
kvn@4001 2661 __ paddw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2662 %}
kvn@4001 2663 ins_pipe( pipe_slow );
kvn@4001 2664 %}
kvn@4001 2665
kvn@4001 2666 instruct vadd4S_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 2667 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2668 match(Set dst (AddVS src1 src2));
kvn@4001 2669 format %{ "vpaddw $dst,$src1,$src2\t! add packed4S" %}
kvn@4001 2670 ins_encode %{
kvn@4001 2671 bool vector256 = false;
kvn@4001 2672 __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2673 %}
kvn@4001 2674 ins_pipe( pipe_slow );
kvn@4001 2675 %}
kvn@4001 2676
kvn@4001 2677 instruct vadd8S(vecX dst, vecX src) %{
kvn@4001 2678 predicate(n->as_Vector()->length() == 8);
kvn@4001 2679 match(Set dst (AddVS dst src));
kvn@4001 2680 format %{ "paddw $dst,$src\t! add packed8S" %}
kvn@4001 2681 ins_encode %{
kvn@4001 2682 __ paddw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2683 %}
kvn@4001 2684 ins_pipe( pipe_slow );
kvn@4001 2685 %}
kvn@4001 2686
kvn@4001 2687 instruct vadd8S_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2688 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 2689 match(Set dst (AddVS src1 src2));
kvn@4001 2690 format %{ "vpaddw $dst,$src1,$src2\t! add packed8S" %}
kvn@4001 2691 ins_encode %{
kvn@4001 2692 bool vector256 = false;
kvn@4001 2693 __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2694 %}
kvn@4001 2695 ins_pipe( pipe_slow );
kvn@4001 2696 %}
kvn@4001 2697
kvn@4001 2698 instruct vadd8S_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2699 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 2700 match(Set dst (AddVS src (LoadVector mem)));
kvn@4001 2701 format %{ "vpaddw $dst,$src,$mem\t! add packed8S" %}
kvn@4001 2702 ins_encode %{
kvn@4001 2703 bool vector256 = false;
kvn@4001 2704 __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2705 %}
kvn@4001 2706 ins_pipe( pipe_slow );
kvn@4001 2707 %}
kvn@4001 2708
kvn@4001 2709 instruct vadd16S_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2710 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 2711 match(Set dst (AddVS src1 src2));
kvn@4001 2712 format %{ "vpaddw $dst,$src1,$src2\t! add packed16S" %}
kvn@4001 2713 ins_encode %{
kvn@4001 2714 bool vector256 = true;
kvn@4001 2715 __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2716 %}
kvn@4001 2717 ins_pipe( pipe_slow );
kvn@4001 2718 %}
kvn@4001 2719
kvn@4001 2720 instruct vadd16S_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2721 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 2722 match(Set dst (AddVS src (LoadVector mem)));
kvn@4001 2723 format %{ "vpaddw $dst,$src,$mem\t! add packed16S" %}
kvn@4001 2724 ins_encode %{
kvn@4001 2725 bool vector256 = true;
kvn@4001 2726 __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2727 %}
kvn@4001 2728 ins_pipe( pipe_slow );
kvn@4001 2729 %}
kvn@4001 2730
kvn@4001 2731 // Integers vector add
kvn@4001 2732 instruct vadd2I(vecD dst, vecD src) %{
kvn@4001 2733 predicate(n->as_Vector()->length() == 2);
kvn@4001 2734 match(Set dst (AddVI dst src));
kvn@4001 2735 format %{ "paddd $dst,$src\t! add packed2I" %}
kvn@4001 2736 ins_encode %{
kvn@4001 2737 __ paddd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2738 %}
kvn@4001 2739 ins_pipe( pipe_slow );
kvn@4001 2740 %}
kvn@4001 2741
kvn@4001 2742 instruct vadd2I_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 2743 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2744 match(Set dst (AddVI src1 src2));
kvn@4001 2745 format %{ "vpaddd $dst,$src1,$src2\t! add packed2I" %}
kvn@4001 2746 ins_encode %{
kvn@4001 2747 bool vector256 = false;
kvn@4001 2748 __ vpaddd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2749 %}
kvn@4001 2750 ins_pipe( pipe_slow );
kvn@4001 2751 %}
kvn@4001 2752
kvn@4001 2753 instruct vadd4I(vecX dst, vecX src) %{
kvn@4001 2754 predicate(n->as_Vector()->length() == 4);
kvn@4001 2755 match(Set dst (AddVI dst src));
kvn@4001 2756 format %{ "paddd $dst,$src\t! add packed4I" %}
kvn@4001 2757 ins_encode %{
kvn@4001 2758 __ paddd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2759 %}
kvn@4001 2760 ins_pipe( pipe_slow );
kvn@4001 2761 %}
kvn@4001 2762
kvn@4001 2763 instruct vadd4I_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2764 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2765 match(Set dst (AddVI src1 src2));
kvn@4001 2766 format %{ "vpaddd $dst,$src1,$src2\t! add packed4I" %}
kvn@4001 2767 ins_encode %{
kvn@4001 2768 bool vector256 = false;
kvn@4001 2769 __ vpaddd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2770 %}
kvn@4001 2771 ins_pipe( pipe_slow );
kvn@4001 2772 %}
kvn@4001 2773
kvn@4001 2774 instruct vadd4I_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2775 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2776 match(Set dst (AddVI src (LoadVector mem)));
kvn@4001 2777 format %{ "vpaddd $dst,$src,$mem\t! add packed4I" %}
kvn@4001 2778 ins_encode %{
kvn@4001 2779 bool vector256 = false;
kvn@4001 2780 __ vpaddd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2781 %}
kvn@4001 2782 ins_pipe( pipe_slow );
kvn@4001 2783 %}
kvn@4001 2784
kvn@4001 2785 instruct vadd8I_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2786 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 2787 match(Set dst (AddVI src1 src2));
kvn@4001 2788 format %{ "vpaddd $dst,$src1,$src2\t! add packed8I" %}
kvn@4001 2789 ins_encode %{
kvn@4001 2790 bool vector256 = true;
kvn@4001 2791 __ vpaddd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2792 %}
kvn@4001 2793 ins_pipe( pipe_slow );
kvn@4001 2794 %}
kvn@4001 2795
kvn@4001 2796 instruct vadd8I_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2797 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 2798 match(Set dst (AddVI src (LoadVector mem)));
kvn@4001 2799 format %{ "vpaddd $dst,$src,$mem\t! add packed8I" %}
kvn@4001 2800 ins_encode %{
kvn@4001 2801 bool vector256 = true;
kvn@4001 2802 __ vpaddd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2803 %}
kvn@4001 2804 ins_pipe( pipe_slow );
kvn@4001 2805 %}
kvn@4001 2806
kvn@4001 2807 // Longs vector add
kvn@4001 2808 instruct vadd2L(vecX dst, vecX src) %{
kvn@4001 2809 predicate(n->as_Vector()->length() == 2);
kvn@4001 2810 match(Set dst (AddVL dst src));
kvn@4001 2811 format %{ "paddq $dst,$src\t! add packed2L" %}
kvn@4001 2812 ins_encode %{
kvn@4001 2813 __ paddq($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2814 %}
kvn@4001 2815 ins_pipe( pipe_slow );
kvn@4001 2816 %}
kvn@4001 2817
kvn@4001 2818 instruct vadd2L_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2819 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2820 match(Set dst (AddVL src1 src2));
kvn@4001 2821 format %{ "vpaddq $dst,$src1,$src2\t! add packed2L" %}
kvn@4001 2822 ins_encode %{
kvn@4001 2823 bool vector256 = false;
kvn@4001 2824 __ vpaddq($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2825 %}
kvn@4001 2826 ins_pipe( pipe_slow );
kvn@4001 2827 %}
kvn@4001 2828
kvn@4001 2829 instruct vadd2L_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2830 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2831 match(Set dst (AddVL src (LoadVector mem)));
kvn@4001 2832 format %{ "vpaddq $dst,$src,$mem\t! add packed2L" %}
kvn@4001 2833 ins_encode %{
kvn@4001 2834 bool vector256 = false;
kvn@4001 2835 __ vpaddq($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2836 %}
kvn@4001 2837 ins_pipe( pipe_slow );
kvn@4001 2838 %}
kvn@4001 2839
kvn@4001 2840 instruct vadd4L_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2841 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 2842 match(Set dst (AddVL src1 src2));
kvn@4001 2843 format %{ "vpaddq $dst,$src1,$src2\t! add packed4L" %}
kvn@4001 2844 ins_encode %{
kvn@4001 2845 bool vector256 = true;
kvn@4001 2846 __ vpaddq($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2847 %}
kvn@4001 2848 ins_pipe( pipe_slow );
kvn@4001 2849 %}
kvn@4001 2850
kvn@4001 2851 instruct vadd4L_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2852 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 2853 match(Set dst (AddVL src (LoadVector mem)));
kvn@4001 2854 format %{ "vpaddq $dst,$src,$mem\t! add packed4L" %}
kvn@4001 2855 ins_encode %{
kvn@4001 2856 bool vector256 = true;
kvn@4001 2857 __ vpaddq($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2858 %}
kvn@4001 2859 ins_pipe( pipe_slow );
kvn@4001 2860 %}
kvn@4001 2861
kvn@4001 2862 // Floats vector add
kvn@4001 2863 instruct vadd2F(vecD dst, vecD src) %{
kvn@4001 2864 predicate(n->as_Vector()->length() == 2);
kvn@4001 2865 match(Set dst (AddVF dst src));
kvn@4001 2866 format %{ "addps $dst,$src\t! add packed2F" %}
kvn@4001 2867 ins_encode %{
kvn@4001 2868 __ addps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2869 %}
kvn@4001 2870 ins_pipe( pipe_slow );
kvn@4001 2871 %}
kvn@4001 2872
kvn@4001 2873 instruct vadd2F_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 2874 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2875 match(Set dst (AddVF src1 src2));
kvn@4001 2876 format %{ "vaddps $dst,$src1,$src2\t! add packed2F" %}
kvn@4001 2877 ins_encode %{
kvn@4001 2878 bool vector256 = false;
kvn@4001 2879 __ vaddps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2880 %}
kvn@4001 2881 ins_pipe( pipe_slow );
kvn@4001 2882 %}
kvn@4001 2883
kvn@4001 2884 instruct vadd4F(vecX dst, vecX src) %{
kvn@4001 2885 predicate(n->as_Vector()->length() == 4);
kvn@4001 2886 match(Set dst (AddVF dst src));
kvn@4001 2887 format %{ "addps $dst,$src\t! add packed4F" %}
kvn@4001 2888 ins_encode %{
kvn@4001 2889 __ addps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2890 %}
kvn@4001 2891 ins_pipe( pipe_slow );
kvn@4001 2892 %}
kvn@4001 2893
kvn@4001 2894 instruct vadd4F_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2895 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2896 match(Set dst (AddVF src1 src2));
kvn@4001 2897 format %{ "vaddps $dst,$src1,$src2\t! add packed4F" %}
kvn@4001 2898 ins_encode %{
kvn@4001 2899 bool vector256 = false;
kvn@4001 2900 __ vaddps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2901 %}
kvn@4001 2902 ins_pipe( pipe_slow );
kvn@4001 2903 %}
kvn@4001 2904
kvn@4001 2905 instruct vadd4F_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2906 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2907 match(Set dst (AddVF src (LoadVector mem)));
kvn@4001 2908 format %{ "vaddps $dst,$src,$mem\t! add packed4F" %}
kvn@4001 2909 ins_encode %{
kvn@4001 2910 bool vector256 = false;
kvn@4001 2911 __ vaddps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2912 %}
kvn@4001 2913 ins_pipe( pipe_slow );
kvn@4001 2914 %}
kvn@4001 2915
kvn@4001 2916 instruct vadd8F_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2917 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 2918 match(Set dst (AddVF src1 src2));
kvn@4001 2919 format %{ "vaddps $dst,$src1,$src2\t! add packed8F" %}
kvn@4001 2920 ins_encode %{
kvn@4001 2921 bool vector256 = true;
kvn@4001 2922 __ vaddps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2923 %}
kvn@4001 2924 ins_pipe( pipe_slow );
kvn@4001 2925 %}
kvn@4001 2926
kvn@4001 2927 instruct vadd8F_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2928 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 2929 match(Set dst (AddVF src (LoadVector mem)));
kvn@4001 2930 format %{ "vaddps $dst,$src,$mem\t! add packed8F" %}
kvn@4001 2931 ins_encode %{
kvn@4001 2932 bool vector256 = true;
kvn@4001 2933 __ vaddps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2934 %}
kvn@4001 2935 ins_pipe( pipe_slow );
kvn@4001 2936 %}
kvn@4001 2937
kvn@4001 2938 // Doubles vector add
kvn@4001 2939 instruct vadd2D(vecX dst, vecX src) %{
kvn@4001 2940 predicate(n->as_Vector()->length() == 2);
kvn@4001 2941 match(Set dst (AddVD dst src));
kvn@4001 2942 format %{ "addpd $dst,$src\t! add packed2D" %}
kvn@4001 2943 ins_encode %{
kvn@4001 2944 __ addpd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 2945 %}
kvn@4001 2946 ins_pipe( pipe_slow );
kvn@4001 2947 %}
kvn@4001 2948
kvn@4001 2949 instruct vadd2D_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 2950 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2951 match(Set dst (AddVD src1 src2));
kvn@4001 2952 format %{ "vaddpd $dst,$src1,$src2\t! add packed2D" %}
kvn@4001 2953 ins_encode %{
kvn@4001 2954 bool vector256 = false;
kvn@4001 2955 __ vaddpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2956 %}
kvn@4001 2957 ins_pipe( pipe_slow );
kvn@4001 2958 %}
kvn@4001 2959
kvn@4001 2960 instruct vadd2D_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 2961 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 2962 match(Set dst (AddVD src (LoadVector mem)));
kvn@4001 2963 format %{ "vaddpd $dst,$src,$mem\t! add packed2D" %}
kvn@4001 2964 ins_encode %{
kvn@4001 2965 bool vector256 = false;
kvn@4001 2966 __ vaddpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2967 %}
kvn@4001 2968 ins_pipe( pipe_slow );
kvn@4001 2969 %}
kvn@4001 2970
kvn@4001 2971 instruct vadd4D_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 2972 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2973 match(Set dst (AddVD src1 src2));
kvn@4001 2974 format %{ "vaddpd $dst,$src1,$src2\t! add packed4D" %}
kvn@4001 2975 ins_encode %{
kvn@4001 2976 bool vector256 = true;
kvn@4001 2977 __ vaddpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 2978 %}
kvn@4001 2979 ins_pipe( pipe_slow );
kvn@4001 2980 %}
kvn@4001 2981
kvn@4001 2982 instruct vadd4D_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 2983 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 2984 match(Set dst (AddVD src (LoadVector mem)));
kvn@4001 2985 format %{ "vaddpd $dst,$src,$mem\t! add packed4D" %}
kvn@4001 2986 ins_encode %{
kvn@4001 2987 bool vector256 = true;
kvn@4001 2988 __ vaddpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 2989 %}
kvn@4001 2990 ins_pipe( pipe_slow );
kvn@4001 2991 %}
kvn@4001 2992
kvn@4001 2993 // --------------------------------- SUB --------------------------------------
kvn@4001 2994
kvn@4001 2995 // Bytes vector sub
kvn@4001 2996 instruct vsub4B(vecS dst, vecS src) %{
kvn@4001 2997 predicate(n->as_Vector()->length() == 4);
kvn@4001 2998 match(Set dst (SubVB dst src));
kvn@4001 2999 format %{ "psubb $dst,$src\t! sub packed4B" %}
kvn@4001 3000 ins_encode %{
kvn@4001 3001 __ psubb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3002 %}
kvn@4001 3003 ins_pipe( pipe_slow );
kvn@4001 3004 %}
kvn@4001 3005
kvn@4001 3006 instruct vsub4B_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 3007 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3008 match(Set dst (SubVB src1 src2));
kvn@4001 3009 format %{ "vpsubb $dst,$src1,$src2\t! sub packed4B" %}
kvn@4001 3010 ins_encode %{
kvn@4001 3011 bool vector256 = false;
kvn@4001 3012 __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3013 %}
kvn@4001 3014 ins_pipe( pipe_slow );
kvn@4001 3015 %}
kvn@4001 3016
kvn@4001 3017 instruct vsub8B(vecD dst, vecD src) %{
kvn@4001 3018 predicate(n->as_Vector()->length() == 8);
kvn@4001 3019 match(Set dst (SubVB dst src));
kvn@4001 3020 format %{ "psubb $dst,$src\t! sub packed8B" %}
kvn@4001 3021 ins_encode %{
kvn@4001 3022 __ psubb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3023 %}
kvn@4001 3024 ins_pipe( pipe_slow );
kvn@4001 3025 %}
kvn@4001 3026
kvn@4001 3027 instruct vsub8B_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3028 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3029 match(Set dst (SubVB src1 src2));
kvn@4001 3030 format %{ "vpsubb $dst,$src1,$src2\t! sub packed8B" %}
kvn@4001 3031 ins_encode %{
kvn@4001 3032 bool vector256 = false;
kvn@4001 3033 __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3034 %}
kvn@4001 3035 ins_pipe( pipe_slow );
kvn@4001 3036 %}
kvn@4001 3037
kvn@4001 3038 instruct vsub16B(vecX dst, vecX src) %{
kvn@4001 3039 predicate(n->as_Vector()->length() == 16);
kvn@4001 3040 match(Set dst (SubVB dst src));
kvn@4001 3041 format %{ "psubb $dst,$src\t! sub packed16B" %}
kvn@4001 3042 ins_encode %{
kvn@4001 3043 __ psubb($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3044 %}
kvn@4001 3045 ins_pipe( pipe_slow );
kvn@4001 3046 %}
kvn@4001 3047
kvn@4001 3048 instruct vsub16B_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3049 predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
kvn@4001 3050 match(Set dst (SubVB src1 src2));
kvn@4001 3051 format %{ "vpsubb $dst,$src1,$src2\t! sub packed16B" %}
kvn@4001 3052 ins_encode %{
kvn@4001 3053 bool vector256 = false;
kvn@4001 3054 __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3055 %}
kvn@4001 3056 ins_pipe( pipe_slow );
kvn@4001 3057 %}
kvn@4001 3058
kvn@4001 3059 instruct vsub16B_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3060 predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
kvn@4001 3061 match(Set dst (SubVB src (LoadVector mem)));
kvn@4001 3062 format %{ "vpsubb $dst,$src,$mem\t! sub packed16B" %}
kvn@4001 3063 ins_encode %{
kvn@4001 3064 bool vector256 = false;
kvn@4001 3065 __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3066 %}
kvn@4001 3067 ins_pipe( pipe_slow );
kvn@4001 3068 %}
kvn@4001 3069
kvn@4001 3070 instruct vsub32B_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3071 predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
kvn@4001 3072 match(Set dst (SubVB src1 src2));
kvn@4001 3073 format %{ "vpsubb $dst,$src1,$src2\t! sub packed32B" %}
kvn@4001 3074 ins_encode %{
kvn@4001 3075 bool vector256 = true;
kvn@4001 3076 __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3077 %}
kvn@4001 3078 ins_pipe( pipe_slow );
kvn@4001 3079 %}
kvn@4001 3080
kvn@4001 3081 instruct vsub32B_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3082 predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
kvn@4001 3083 match(Set dst (SubVB src (LoadVector mem)));
kvn@4001 3084 format %{ "vpsubb $dst,$src,$mem\t! sub packed32B" %}
kvn@4001 3085 ins_encode %{
kvn@4001 3086 bool vector256 = true;
kvn@4001 3087 __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3088 %}
kvn@4001 3089 ins_pipe( pipe_slow );
kvn@4001 3090 %}
kvn@4001 3091
kvn@4001 3092 // Shorts/Chars vector sub
kvn@4001 3093 instruct vsub2S(vecS dst, vecS src) %{
kvn@4001 3094 predicate(n->as_Vector()->length() == 2);
kvn@4001 3095 match(Set dst (SubVS dst src));
kvn@4001 3096 format %{ "psubw $dst,$src\t! sub packed2S" %}
kvn@4001 3097 ins_encode %{
kvn@4001 3098 __ psubw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3099 %}
kvn@4001 3100 ins_pipe( pipe_slow );
kvn@4001 3101 %}
kvn@4001 3102
kvn@4001 3103 instruct vsub2S_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 3104 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3105 match(Set dst (SubVS src1 src2));
kvn@4001 3106 format %{ "vpsubw $dst,$src1,$src2\t! sub packed2S" %}
kvn@4001 3107 ins_encode %{
kvn@4001 3108 bool vector256 = false;
kvn@4001 3109 __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3110 %}
kvn@4001 3111 ins_pipe( pipe_slow );
kvn@4001 3112 %}
kvn@4001 3113
kvn@4001 3114 instruct vsub4S(vecD dst, vecD src) %{
kvn@4001 3115 predicate(n->as_Vector()->length() == 4);
kvn@4001 3116 match(Set dst (SubVS dst src));
kvn@4001 3117 format %{ "psubw $dst,$src\t! sub packed4S" %}
kvn@4001 3118 ins_encode %{
kvn@4001 3119 __ psubw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3120 %}
kvn@4001 3121 ins_pipe( pipe_slow );
kvn@4001 3122 %}
kvn@4001 3123
kvn@4001 3124 instruct vsub4S_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3125 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3126 match(Set dst (SubVS src1 src2));
kvn@4001 3127 format %{ "vpsubw $dst,$src1,$src2\t! sub packed4S" %}
kvn@4001 3128 ins_encode %{
kvn@4001 3129 bool vector256 = false;
kvn@4001 3130 __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3131 %}
kvn@4001 3132 ins_pipe( pipe_slow );
kvn@4001 3133 %}
kvn@4001 3134
kvn@4001 3135 instruct vsub8S(vecX dst, vecX src) %{
kvn@4001 3136 predicate(n->as_Vector()->length() == 8);
kvn@4001 3137 match(Set dst (SubVS dst src));
kvn@4001 3138 format %{ "psubw $dst,$src\t! sub packed8S" %}
kvn@4001 3139 ins_encode %{
kvn@4001 3140 __ psubw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3141 %}
kvn@4001 3142 ins_pipe( pipe_slow );
kvn@4001 3143 %}
kvn@4001 3144
kvn@4001 3145 instruct vsub8S_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3146 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3147 match(Set dst (SubVS src1 src2));
kvn@4001 3148 format %{ "vpsubw $dst,$src1,$src2\t! sub packed8S" %}
kvn@4001 3149 ins_encode %{
kvn@4001 3150 bool vector256 = false;
kvn@4001 3151 __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3152 %}
kvn@4001 3153 ins_pipe( pipe_slow );
kvn@4001 3154 %}
kvn@4001 3155
kvn@4001 3156 instruct vsub8S_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3157 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3158 match(Set dst (SubVS src (LoadVector mem)));
kvn@4001 3159 format %{ "vpsubw $dst,$src,$mem\t! sub packed8S" %}
kvn@4001 3160 ins_encode %{
kvn@4001 3161 bool vector256 = false;
kvn@4001 3162 __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3163 %}
kvn@4001 3164 ins_pipe( pipe_slow );
kvn@4001 3165 %}
kvn@4001 3166
kvn@4001 3167 instruct vsub16S_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3168 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 3169 match(Set dst (SubVS src1 src2));
kvn@4001 3170 format %{ "vpsubw $dst,$src1,$src2\t! sub packed16S" %}
kvn@4001 3171 ins_encode %{
kvn@4001 3172 bool vector256 = true;
kvn@4001 3173 __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3174 %}
kvn@4001 3175 ins_pipe( pipe_slow );
kvn@4001 3176 %}
kvn@4001 3177
kvn@4001 3178 instruct vsub16S_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3179 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 3180 match(Set dst (SubVS src (LoadVector mem)));
kvn@4001 3181 format %{ "vpsubw $dst,$src,$mem\t! sub packed16S" %}
kvn@4001 3182 ins_encode %{
kvn@4001 3183 bool vector256 = true;
kvn@4001 3184 __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3185 %}
kvn@4001 3186 ins_pipe( pipe_slow );
kvn@4001 3187 %}
kvn@4001 3188
kvn@4001 3189 // Integers vector sub
kvn@4001 3190 instruct vsub2I(vecD dst, vecD src) %{
kvn@4001 3191 predicate(n->as_Vector()->length() == 2);
kvn@4001 3192 match(Set dst (SubVI dst src));
kvn@4001 3193 format %{ "psubd $dst,$src\t! sub packed2I" %}
kvn@4001 3194 ins_encode %{
kvn@4001 3195 __ psubd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3196 %}
kvn@4001 3197 ins_pipe( pipe_slow );
kvn@4001 3198 %}
kvn@4001 3199
kvn@4001 3200 instruct vsub2I_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3201 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3202 match(Set dst (SubVI src1 src2));
kvn@4001 3203 format %{ "vpsubd $dst,$src1,$src2\t! sub packed2I" %}
kvn@4001 3204 ins_encode %{
kvn@4001 3205 bool vector256 = false;
kvn@4001 3206 __ vpsubd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3207 %}
kvn@4001 3208 ins_pipe( pipe_slow );
kvn@4001 3209 %}
kvn@4001 3210
kvn@4001 3211 instruct vsub4I(vecX dst, vecX src) %{
kvn@4001 3212 predicate(n->as_Vector()->length() == 4);
kvn@4001 3213 match(Set dst (SubVI dst src));
kvn@4001 3214 format %{ "psubd $dst,$src\t! sub packed4I" %}
kvn@4001 3215 ins_encode %{
kvn@4001 3216 __ psubd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3217 %}
kvn@4001 3218 ins_pipe( pipe_slow );
kvn@4001 3219 %}
kvn@4001 3220
kvn@4001 3221 instruct vsub4I_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3222 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3223 match(Set dst (SubVI src1 src2));
kvn@4001 3224 format %{ "vpsubd $dst,$src1,$src2\t! sub packed4I" %}
kvn@4001 3225 ins_encode %{
kvn@4001 3226 bool vector256 = false;
kvn@4001 3227 __ vpsubd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3228 %}
kvn@4001 3229 ins_pipe( pipe_slow );
kvn@4001 3230 %}
kvn@4001 3231
kvn@4001 3232 instruct vsub4I_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3233 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3234 match(Set dst (SubVI src (LoadVector mem)));
kvn@4001 3235 format %{ "vpsubd $dst,$src,$mem\t! sub packed4I" %}
kvn@4001 3236 ins_encode %{
kvn@4001 3237 bool vector256 = false;
kvn@4001 3238 __ vpsubd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3239 %}
kvn@4001 3240 ins_pipe( pipe_slow );
kvn@4001 3241 %}
kvn@4001 3242
kvn@4001 3243 instruct vsub8I_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3244 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 3245 match(Set dst (SubVI src1 src2));
kvn@4001 3246 format %{ "vpsubd $dst,$src1,$src2\t! sub packed8I" %}
kvn@4001 3247 ins_encode %{
kvn@4001 3248 bool vector256 = true;
kvn@4001 3249 __ vpsubd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3250 %}
kvn@4001 3251 ins_pipe( pipe_slow );
kvn@4001 3252 %}
kvn@4001 3253
kvn@4001 3254 instruct vsub8I_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3255 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 3256 match(Set dst (SubVI src (LoadVector mem)));
kvn@4001 3257 format %{ "vpsubd $dst,$src,$mem\t! sub packed8I" %}
kvn@4001 3258 ins_encode %{
kvn@4001 3259 bool vector256 = true;
kvn@4001 3260 __ vpsubd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3261 %}
kvn@4001 3262 ins_pipe( pipe_slow );
kvn@4001 3263 %}
kvn@4001 3264
kvn@4001 3265 // Longs vector sub
kvn@4001 3266 instruct vsub2L(vecX dst, vecX src) %{
kvn@4001 3267 predicate(n->as_Vector()->length() == 2);
kvn@4001 3268 match(Set dst (SubVL dst src));
kvn@4001 3269 format %{ "psubq $dst,$src\t! sub packed2L" %}
kvn@4001 3270 ins_encode %{
kvn@4001 3271 __ psubq($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3272 %}
kvn@4001 3273 ins_pipe( pipe_slow );
kvn@4001 3274 %}
kvn@4001 3275
kvn@4001 3276 instruct vsub2L_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3277 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3278 match(Set dst (SubVL src1 src2));
kvn@4001 3279 format %{ "vpsubq $dst,$src1,$src2\t! sub packed2L" %}
kvn@4001 3280 ins_encode %{
kvn@4001 3281 bool vector256 = false;
kvn@4001 3282 __ vpsubq($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3283 %}
kvn@4001 3284 ins_pipe( pipe_slow );
kvn@4001 3285 %}
kvn@4001 3286
kvn@4001 3287 instruct vsub2L_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3288 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3289 match(Set dst (SubVL src (LoadVector mem)));
kvn@4001 3290 format %{ "vpsubq $dst,$src,$mem\t! sub packed2L" %}
kvn@4001 3291 ins_encode %{
kvn@4001 3292 bool vector256 = false;
kvn@4001 3293 __ vpsubq($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3294 %}
kvn@4001 3295 ins_pipe( pipe_slow );
kvn@4001 3296 %}
kvn@4001 3297
kvn@4001 3298 instruct vsub4L_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3299 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 3300 match(Set dst (SubVL src1 src2));
kvn@4001 3301 format %{ "vpsubq $dst,$src1,$src2\t! sub packed4L" %}
kvn@4001 3302 ins_encode %{
kvn@4001 3303 bool vector256 = true;
kvn@4001 3304 __ vpsubq($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3305 %}
kvn@4001 3306 ins_pipe( pipe_slow );
kvn@4001 3307 %}
kvn@4001 3308
kvn@4001 3309 instruct vsub4L_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3310 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 3311 match(Set dst (SubVL src (LoadVector mem)));
kvn@4001 3312 format %{ "vpsubq $dst,$src,$mem\t! sub packed4L" %}
kvn@4001 3313 ins_encode %{
kvn@4001 3314 bool vector256 = true;
kvn@4001 3315 __ vpsubq($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3316 %}
kvn@4001 3317 ins_pipe( pipe_slow );
kvn@4001 3318 %}
kvn@4001 3319
kvn@4001 3320 // Floats vector sub
kvn@4001 3321 instruct vsub2F(vecD dst, vecD src) %{
kvn@4001 3322 predicate(n->as_Vector()->length() == 2);
kvn@4001 3323 match(Set dst (SubVF dst src));
kvn@4001 3324 format %{ "subps $dst,$src\t! sub packed2F" %}
kvn@4001 3325 ins_encode %{
kvn@4001 3326 __ subps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3327 %}
kvn@4001 3328 ins_pipe( pipe_slow );
kvn@4001 3329 %}
kvn@4001 3330
kvn@4001 3331 instruct vsub2F_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3332 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3333 match(Set dst (SubVF src1 src2));
kvn@4001 3334 format %{ "vsubps $dst,$src1,$src2\t! sub packed2F" %}
kvn@4001 3335 ins_encode %{
kvn@4001 3336 bool vector256 = false;
kvn@4001 3337 __ vsubps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3338 %}
kvn@4001 3339 ins_pipe( pipe_slow );
kvn@4001 3340 %}
kvn@4001 3341
kvn@4001 3342 instruct vsub4F(vecX dst, vecX src) %{
kvn@4001 3343 predicate(n->as_Vector()->length() == 4);
kvn@4001 3344 match(Set dst (SubVF dst src));
kvn@4001 3345 format %{ "subps $dst,$src\t! sub packed4F" %}
kvn@4001 3346 ins_encode %{
kvn@4001 3347 __ subps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3348 %}
kvn@4001 3349 ins_pipe( pipe_slow );
kvn@4001 3350 %}
kvn@4001 3351
kvn@4001 3352 instruct vsub4F_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3353 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3354 match(Set dst (SubVF src1 src2));
kvn@4001 3355 format %{ "vsubps $dst,$src1,$src2\t! sub packed4F" %}
kvn@4001 3356 ins_encode %{
kvn@4001 3357 bool vector256 = false;
kvn@4001 3358 __ vsubps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3359 %}
kvn@4001 3360 ins_pipe( pipe_slow );
kvn@4001 3361 %}
kvn@4001 3362
kvn@4001 3363 instruct vsub4F_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3364 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3365 match(Set dst (SubVF src (LoadVector mem)));
kvn@4001 3366 format %{ "vsubps $dst,$src,$mem\t! sub packed4F" %}
kvn@4001 3367 ins_encode %{
kvn@4001 3368 bool vector256 = false;
kvn@4001 3369 __ vsubps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3370 %}
kvn@4001 3371 ins_pipe( pipe_slow );
kvn@4001 3372 %}
kvn@4001 3373
kvn@4001 3374 instruct vsub8F_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3375 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3376 match(Set dst (SubVF src1 src2));
kvn@4001 3377 format %{ "vsubps $dst,$src1,$src2\t! sub packed8F" %}
kvn@4001 3378 ins_encode %{
kvn@4001 3379 bool vector256 = true;
kvn@4001 3380 __ vsubps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3381 %}
kvn@4001 3382 ins_pipe( pipe_slow );
kvn@4001 3383 %}
kvn@4001 3384
kvn@4001 3385 instruct vsub8F_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3386 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3387 match(Set dst (SubVF src (LoadVector mem)));
kvn@4001 3388 format %{ "vsubps $dst,$src,$mem\t! sub packed8F" %}
kvn@4001 3389 ins_encode %{
kvn@4001 3390 bool vector256 = true;
kvn@4001 3391 __ vsubps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3392 %}
kvn@4001 3393 ins_pipe( pipe_slow );
kvn@4001 3394 %}
kvn@4001 3395
kvn@4001 3396 // Doubles vector sub
kvn@4001 3397 instruct vsub2D(vecX dst, vecX src) %{
kvn@4001 3398 predicate(n->as_Vector()->length() == 2);
kvn@4001 3399 match(Set dst (SubVD dst src));
kvn@4001 3400 format %{ "subpd $dst,$src\t! sub packed2D" %}
kvn@4001 3401 ins_encode %{
kvn@4001 3402 __ subpd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3403 %}
kvn@4001 3404 ins_pipe( pipe_slow );
kvn@4001 3405 %}
kvn@4001 3406
kvn@4001 3407 instruct vsub2D_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3408 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3409 match(Set dst (SubVD src1 src2));
kvn@4001 3410 format %{ "vsubpd $dst,$src1,$src2\t! sub packed2D" %}
kvn@4001 3411 ins_encode %{
kvn@4001 3412 bool vector256 = false;
kvn@4001 3413 __ vsubpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3414 %}
kvn@4001 3415 ins_pipe( pipe_slow );
kvn@4001 3416 %}
kvn@4001 3417
kvn@4001 3418 instruct vsub2D_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3419 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3420 match(Set dst (SubVD src (LoadVector mem)));
kvn@4001 3421 format %{ "vsubpd $dst,$src,$mem\t! sub packed2D" %}
kvn@4001 3422 ins_encode %{
kvn@4001 3423 bool vector256 = false;
kvn@4001 3424 __ vsubpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3425 %}
kvn@4001 3426 ins_pipe( pipe_slow );
kvn@4001 3427 %}
kvn@4001 3428
kvn@4001 3429 instruct vsub4D_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3430 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3431 match(Set dst (SubVD src1 src2));
kvn@4001 3432 format %{ "vsubpd $dst,$src1,$src2\t! sub packed4D" %}
kvn@4001 3433 ins_encode %{
kvn@4001 3434 bool vector256 = true;
kvn@4001 3435 __ vsubpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3436 %}
kvn@4001 3437 ins_pipe( pipe_slow );
kvn@4001 3438 %}
kvn@4001 3439
kvn@4001 3440 instruct vsub4D_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3441 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3442 match(Set dst (SubVD src (LoadVector mem)));
kvn@4001 3443 format %{ "vsubpd $dst,$src,$mem\t! sub packed4D" %}
kvn@4001 3444 ins_encode %{
kvn@4001 3445 bool vector256 = true;
kvn@4001 3446 __ vsubpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3447 %}
kvn@4001 3448 ins_pipe( pipe_slow );
kvn@4001 3449 %}
kvn@4001 3450
kvn@4001 3451 // --------------------------------- MUL --------------------------------------
kvn@4001 3452
kvn@4001 3453 // Shorts/Chars vector mul
kvn@4001 3454 instruct vmul2S(vecS dst, vecS src) %{
kvn@4001 3455 predicate(n->as_Vector()->length() == 2);
kvn@4001 3456 match(Set dst (MulVS dst src));
kvn@4001 3457 format %{ "pmullw $dst,$src\t! mul packed2S" %}
kvn@4001 3458 ins_encode %{
kvn@4001 3459 __ pmullw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3460 %}
kvn@4001 3461 ins_pipe( pipe_slow );
kvn@4001 3462 %}
kvn@4001 3463
kvn@4001 3464 instruct vmul2S_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 3465 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3466 match(Set dst (MulVS src1 src2));
kvn@4001 3467 format %{ "vpmullw $dst,$src1,$src2\t! mul packed2S" %}
kvn@4001 3468 ins_encode %{
kvn@4001 3469 bool vector256 = false;
kvn@4001 3470 __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3471 %}
kvn@4001 3472 ins_pipe( pipe_slow );
kvn@4001 3473 %}
kvn@4001 3474
kvn@4001 3475 instruct vmul4S(vecD dst, vecD src) %{
kvn@4001 3476 predicate(n->as_Vector()->length() == 4);
kvn@4001 3477 match(Set dst (MulVS dst src));
kvn@4001 3478 format %{ "pmullw $dst,$src\t! mul packed4S" %}
kvn@4001 3479 ins_encode %{
kvn@4001 3480 __ pmullw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3481 %}
kvn@4001 3482 ins_pipe( pipe_slow );
kvn@4001 3483 %}
kvn@4001 3484
kvn@4001 3485 instruct vmul4S_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3486 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3487 match(Set dst (MulVS src1 src2));
kvn@4001 3488 format %{ "vpmullw $dst,$src1,$src2\t! mul packed4S" %}
kvn@4001 3489 ins_encode %{
kvn@4001 3490 bool vector256 = false;
kvn@4001 3491 __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3492 %}
kvn@4001 3493 ins_pipe( pipe_slow );
kvn@4001 3494 %}
kvn@4001 3495
kvn@4001 3496 instruct vmul8S(vecX dst, vecX src) %{
kvn@4001 3497 predicate(n->as_Vector()->length() == 8);
kvn@4001 3498 match(Set dst (MulVS dst src));
kvn@4001 3499 format %{ "pmullw $dst,$src\t! mul packed8S" %}
kvn@4001 3500 ins_encode %{
kvn@4001 3501 __ pmullw($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3502 %}
kvn@4001 3503 ins_pipe( pipe_slow );
kvn@4001 3504 %}
kvn@4001 3505
kvn@4001 3506 instruct vmul8S_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3507 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3508 match(Set dst (MulVS src1 src2));
kvn@4001 3509 format %{ "vpmullw $dst,$src1,$src2\t! mul packed8S" %}
kvn@4001 3510 ins_encode %{
kvn@4001 3511 bool vector256 = false;
kvn@4001 3512 __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3513 %}
kvn@4001 3514 ins_pipe( pipe_slow );
kvn@4001 3515 %}
kvn@4001 3516
kvn@4001 3517 instruct vmul8S_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3518 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3519 match(Set dst (MulVS src (LoadVector mem)));
kvn@4001 3520 format %{ "vpmullw $dst,$src,$mem\t! mul packed8S" %}
kvn@4001 3521 ins_encode %{
kvn@4001 3522 bool vector256 = false;
kvn@4001 3523 __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3524 %}
kvn@4001 3525 ins_pipe( pipe_slow );
kvn@4001 3526 %}
kvn@4001 3527
kvn@4001 3528 instruct vmul16S_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3529 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 3530 match(Set dst (MulVS src1 src2));
kvn@4001 3531 format %{ "vpmullw $dst,$src1,$src2\t! mul packed16S" %}
kvn@4001 3532 ins_encode %{
kvn@4001 3533 bool vector256 = true;
kvn@4001 3534 __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3535 %}
kvn@4001 3536 ins_pipe( pipe_slow );
kvn@4001 3537 %}
kvn@4001 3538
kvn@4001 3539 instruct vmul16S_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3540 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 3541 match(Set dst (MulVS src (LoadVector mem)));
kvn@4001 3542 format %{ "vpmullw $dst,$src,$mem\t! mul packed16S" %}
kvn@4001 3543 ins_encode %{
kvn@4001 3544 bool vector256 = true;
kvn@4001 3545 __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3546 %}
kvn@4001 3547 ins_pipe( pipe_slow );
kvn@4001 3548 %}
kvn@4001 3549
kvn@4001 3550 // Integers vector mul (sse4_1)
kvn@4001 3551 instruct vmul2I(vecD dst, vecD src) %{
kvn@4001 3552 predicate(UseSSE > 3 && n->as_Vector()->length() == 2);
kvn@4001 3553 match(Set dst (MulVI dst src));
kvn@4001 3554 format %{ "pmulld $dst,$src\t! mul packed2I" %}
kvn@4001 3555 ins_encode %{
kvn@4001 3556 __ pmulld($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3557 %}
kvn@4001 3558 ins_pipe( pipe_slow );
kvn@4001 3559 %}
kvn@4001 3560
kvn@4001 3561 instruct vmul2I_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3562 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3563 match(Set dst (MulVI src1 src2));
kvn@4001 3564 format %{ "vpmulld $dst,$src1,$src2\t! mul packed2I" %}
kvn@4001 3565 ins_encode %{
kvn@4001 3566 bool vector256 = false;
kvn@4001 3567 __ vpmulld($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3568 %}
kvn@4001 3569 ins_pipe( pipe_slow );
kvn@4001 3570 %}
kvn@4001 3571
kvn@4001 3572 instruct vmul4I(vecX dst, vecX src) %{
kvn@4001 3573 predicate(UseSSE > 3 && n->as_Vector()->length() == 4);
kvn@4001 3574 match(Set dst (MulVI dst src));
kvn@4001 3575 format %{ "pmulld $dst,$src\t! mul packed4I" %}
kvn@4001 3576 ins_encode %{
kvn@4001 3577 __ pmulld($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3578 %}
kvn@4001 3579 ins_pipe( pipe_slow );
kvn@4001 3580 %}
kvn@4001 3581
kvn@4001 3582 instruct vmul4I_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3583 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3584 match(Set dst (MulVI src1 src2));
kvn@4001 3585 format %{ "vpmulld $dst,$src1,$src2\t! mul packed4I" %}
kvn@4001 3586 ins_encode %{
kvn@4001 3587 bool vector256 = false;
kvn@4001 3588 __ vpmulld($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3589 %}
kvn@4001 3590 ins_pipe( pipe_slow );
kvn@4001 3591 %}
kvn@4001 3592
kvn@4001 3593 instruct vmul4I_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3594 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3595 match(Set dst (MulVI src (LoadVector mem)));
kvn@4001 3596 format %{ "vpmulld $dst,$src,$mem\t! mul packed4I" %}
kvn@4001 3597 ins_encode %{
kvn@4001 3598 bool vector256 = false;
kvn@4001 3599 __ vpmulld($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3600 %}
kvn@4001 3601 ins_pipe( pipe_slow );
kvn@4001 3602 %}
kvn@4001 3603
kvn@4001 3604 instruct vmul8I_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3605 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 3606 match(Set dst (MulVI src1 src2));
kvn@4001 3607 format %{ "vpmulld $dst,$src1,$src2\t! mul packed8I" %}
kvn@4001 3608 ins_encode %{
kvn@4001 3609 bool vector256 = true;
kvn@4001 3610 __ vpmulld($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3611 %}
kvn@4001 3612 ins_pipe( pipe_slow );
kvn@4001 3613 %}
kvn@4001 3614
kvn@4001 3615 instruct vmul8I_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3616 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 3617 match(Set dst (MulVI src (LoadVector mem)));
kvn@4001 3618 format %{ "vpmulld $dst,$src,$mem\t! mul packed8I" %}
kvn@4001 3619 ins_encode %{
kvn@4001 3620 bool vector256 = true;
kvn@4001 3621 __ vpmulld($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3622 %}
kvn@4001 3623 ins_pipe( pipe_slow );
kvn@4001 3624 %}
kvn@4001 3625
kvn@4001 3626 // Floats vector mul
kvn@4001 3627 instruct vmul2F(vecD dst, vecD src) %{
kvn@4001 3628 predicate(n->as_Vector()->length() == 2);
kvn@4001 3629 match(Set dst (MulVF dst src));
kvn@4001 3630 format %{ "mulps $dst,$src\t! mul packed2F" %}
kvn@4001 3631 ins_encode %{
kvn@4001 3632 __ mulps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3633 %}
kvn@4001 3634 ins_pipe( pipe_slow );
kvn@4001 3635 %}
kvn@4001 3636
kvn@4001 3637 instruct vmul2F_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3638 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3639 match(Set dst (MulVF src1 src2));
kvn@4001 3640 format %{ "vmulps $dst,$src1,$src2\t! mul packed2F" %}
kvn@4001 3641 ins_encode %{
kvn@4001 3642 bool vector256 = false;
kvn@4001 3643 __ vmulps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3644 %}
kvn@4001 3645 ins_pipe( pipe_slow );
kvn@4001 3646 %}
kvn@4001 3647
kvn@4001 3648 instruct vmul4F(vecX dst, vecX src) %{
kvn@4001 3649 predicate(n->as_Vector()->length() == 4);
kvn@4001 3650 match(Set dst (MulVF dst src));
kvn@4001 3651 format %{ "mulps $dst,$src\t! mul packed4F" %}
kvn@4001 3652 ins_encode %{
kvn@4001 3653 __ mulps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3654 %}
kvn@4001 3655 ins_pipe( pipe_slow );
kvn@4001 3656 %}
kvn@4001 3657
kvn@4001 3658 instruct vmul4F_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3659 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3660 match(Set dst (MulVF src1 src2));
kvn@4001 3661 format %{ "vmulps $dst,$src1,$src2\t! mul packed4F" %}
kvn@4001 3662 ins_encode %{
kvn@4001 3663 bool vector256 = false;
kvn@4001 3664 __ vmulps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3665 %}
kvn@4001 3666 ins_pipe( pipe_slow );
kvn@4001 3667 %}
kvn@4001 3668
kvn@4001 3669 instruct vmul4F_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3670 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3671 match(Set dst (MulVF src (LoadVector mem)));
kvn@4001 3672 format %{ "vmulps $dst,$src,$mem\t! mul packed4F" %}
kvn@4001 3673 ins_encode %{
kvn@4001 3674 bool vector256 = false;
kvn@4001 3675 __ vmulps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3676 %}
kvn@4001 3677 ins_pipe( pipe_slow );
kvn@4001 3678 %}
kvn@4001 3679
kvn@4001 3680 instruct vmul8F_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3681 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3682 match(Set dst (MulVF src1 src2));
kvn@4001 3683 format %{ "vmulps $dst,$src1,$src2\t! mul packed8F" %}
kvn@4001 3684 ins_encode %{
kvn@4001 3685 bool vector256 = true;
kvn@4001 3686 __ vmulps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3687 %}
kvn@4001 3688 ins_pipe( pipe_slow );
kvn@4001 3689 %}
kvn@4001 3690
kvn@4001 3691 instruct vmul8F_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3692 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3693 match(Set dst (MulVF src (LoadVector mem)));
kvn@4001 3694 format %{ "vmulps $dst,$src,$mem\t! mul packed8F" %}
kvn@4001 3695 ins_encode %{
kvn@4001 3696 bool vector256 = true;
kvn@4001 3697 __ vmulps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3698 %}
kvn@4001 3699 ins_pipe( pipe_slow );
kvn@4001 3700 %}
kvn@4001 3701
kvn@4001 3702 // Doubles vector mul
kvn@4001 3703 instruct vmul2D(vecX dst, vecX src) %{
kvn@4001 3704 predicate(n->as_Vector()->length() == 2);
kvn@4001 3705 match(Set dst (MulVD dst src));
kvn@4001 3706 format %{ "mulpd $dst,$src\t! mul packed2D" %}
kvn@4001 3707 ins_encode %{
kvn@4001 3708 __ mulpd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3709 %}
kvn@4001 3710 ins_pipe( pipe_slow );
kvn@4001 3711 %}
kvn@4001 3712
kvn@4001 3713 instruct vmul2D_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3714 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3715 match(Set dst (MulVD src1 src2));
kvn@4001 3716 format %{ "vmulpd $dst,$src1,$src2\t! mul packed2D" %}
kvn@4001 3717 ins_encode %{
kvn@4001 3718 bool vector256 = false;
kvn@4001 3719 __ vmulpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3720 %}
kvn@4001 3721 ins_pipe( pipe_slow );
kvn@4001 3722 %}
kvn@4001 3723
kvn@4001 3724 instruct vmul2D_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3725 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3726 match(Set dst (MulVD src (LoadVector mem)));
kvn@4001 3727 format %{ "vmulpd $dst,$src,$mem\t! mul packed2D" %}
kvn@4001 3728 ins_encode %{
kvn@4001 3729 bool vector256 = false;
kvn@4001 3730 __ vmulpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3731 %}
kvn@4001 3732 ins_pipe( pipe_slow );
kvn@4001 3733 %}
kvn@4001 3734
kvn@4001 3735 instruct vmul4D_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3736 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3737 match(Set dst (MulVD src1 src2));
kvn@4001 3738 format %{ "vmulpd $dst,$src1,$src2\t! mul packed4D" %}
kvn@4001 3739 ins_encode %{
kvn@4001 3740 bool vector256 = true;
kvn@4001 3741 __ vmulpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3742 %}
kvn@4001 3743 ins_pipe( pipe_slow );
kvn@4001 3744 %}
kvn@4001 3745
kvn@4001 3746 instruct vmul4D_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3747 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3748 match(Set dst (MulVD src (LoadVector mem)));
kvn@4001 3749 format %{ "vmulpd $dst,$src,$mem\t! mul packed4D" %}
kvn@4001 3750 ins_encode %{
kvn@4001 3751 bool vector256 = true;
kvn@4001 3752 __ vmulpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3753 %}
kvn@4001 3754 ins_pipe( pipe_slow );
kvn@4001 3755 %}
kvn@4001 3756
kvn@4001 3757 // --------------------------------- DIV --------------------------------------
kvn@4001 3758
kvn@4001 3759 // Floats vector div
kvn@4001 3760 instruct vdiv2F(vecD dst, vecD src) %{
kvn@4001 3761 predicate(n->as_Vector()->length() == 2);
kvn@4001 3762 match(Set dst (DivVF dst src));
kvn@4001 3763 format %{ "divps $dst,$src\t! div packed2F" %}
kvn@4001 3764 ins_encode %{
kvn@4001 3765 __ divps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3766 %}
kvn@4001 3767 ins_pipe( pipe_slow );
kvn@4001 3768 %}
kvn@4001 3769
kvn@4001 3770 instruct vdiv2F_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 3771 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3772 match(Set dst (DivVF src1 src2));
kvn@4001 3773 format %{ "vdivps $dst,$src1,$src2\t! div packed2F" %}
kvn@4001 3774 ins_encode %{
kvn@4001 3775 bool vector256 = false;
kvn@4001 3776 __ vdivps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3777 %}
kvn@4001 3778 ins_pipe( pipe_slow );
kvn@4001 3779 %}
kvn@4001 3780
kvn@4001 3781 instruct vdiv4F(vecX dst, vecX src) %{
kvn@4001 3782 predicate(n->as_Vector()->length() == 4);
kvn@4001 3783 match(Set dst (DivVF dst src));
kvn@4001 3784 format %{ "divps $dst,$src\t! div packed4F" %}
kvn@4001 3785 ins_encode %{
kvn@4001 3786 __ divps($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3787 %}
kvn@4001 3788 ins_pipe( pipe_slow );
kvn@4001 3789 %}
kvn@4001 3790
kvn@4001 3791 instruct vdiv4F_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3792 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3793 match(Set dst (DivVF src1 src2));
kvn@4001 3794 format %{ "vdivps $dst,$src1,$src2\t! div packed4F" %}
kvn@4001 3795 ins_encode %{
kvn@4001 3796 bool vector256 = false;
kvn@4001 3797 __ vdivps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3798 %}
kvn@4001 3799 ins_pipe( pipe_slow );
kvn@4001 3800 %}
kvn@4001 3801
kvn@4001 3802 instruct vdiv4F_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3803 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3804 match(Set dst (DivVF src (LoadVector mem)));
kvn@4001 3805 format %{ "vdivps $dst,$src,$mem\t! div packed4F" %}
kvn@4001 3806 ins_encode %{
kvn@4001 3807 bool vector256 = false;
kvn@4001 3808 __ vdivps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3809 %}
kvn@4001 3810 ins_pipe( pipe_slow );
kvn@4001 3811 %}
kvn@4001 3812
kvn@4001 3813 instruct vdiv8F_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3814 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3815 match(Set dst (DivVF src1 src2));
kvn@4001 3816 format %{ "vdivps $dst,$src1,$src2\t! div packed8F" %}
kvn@4001 3817 ins_encode %{
kvn@4001 3818 bool vector256 = true;
kvn@4001 3819 __ vdivps($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3820 %}
kvn@4001 3821 ins_pipe( pipe_slow );
kvn@4001 3822 %}
kvn@4001 3823
kvn@4001 3824 instruct vdiv8F_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3825 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 3826 match(Set dst (DivVF src (LoadVector mem)));
kvn@4001 3827 format %{ "vdivps $dst,$src,$mem\t! div packed8F" %}
kvn@4001 3828 ins_encode %{
kvn@4001 3829 bool vector256 = true;
kvn@4001 3830 __ vdivps($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3831 %}
kvn@4001 3832 ins_pipe( pipe_slow );
kvn@4001 3833 %}
kvn@4001 3834
kvn@4001 3835 // Doubles vector div
kvn@4001 3836 instruct vdiv2D(vecX dst, vecX src) %{
kvn@4001 3837 predicate(n->as_Vector()->length() == 2);
kvn@4001 3838 match(Set dst (DivVD dst src));
kvn@4001 3839 format %{ "divpd $dst,$src\t! div packed2D" %}
kvn@4001 3840 ins_encode %{
kvn@4001 3841 __ divpd($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 3842 %}
kvn@4001 3843 ins_pipe( pipe_slow );
kvn@4001 3844 %}
kvn@4001 3845
kvn@4001 3846 instruct vdiv2D_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 3847 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3848 match(Set dst (DivVD src1 src2));
kvn@4001 3849 format %{ "vdivpd $dst,$src1,$src2\t! div packed2D" %}
kvn@4001 3850 ins_encode %{
kvn@4001 3851 bool vector256 = false;
kvn@4001 3852 __ vdivpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3853 %}
kvn@4001 3854 ins_pipe( pipe_slow );
kvn@4001 3855 %}
kvn@4001 3856
kvn@4001 3857 instruct vdiv2D_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 3858 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3859 match(Set dst (DivVD src (LoadVector mem)));
kvn@4001 3860 format %{ "vdivpd $dst,$src,$mem\t! div packed2D" %}
kvn@4001 3861 ins_encode %{
kvn@4001 3862 bool vector256 = false;
kvn@4001 3863 __ vdivpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3864 %}
kvn@4001 3865 ins_pipe( pipe_slow );
kvn@4001 3866 %}
kvn@4001 3867
kvn@4001 3868 instruct vdiv4D_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 3869 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3870 match(Set dst (DivVD src1 src2));
kvn@4001 3871 format %{ "vdivpd $dst,$src1,$src2\t! div packed4D" %}
kvn@4001 3872 ins_encode %{
kvn@4001 3873 bool vector256 = true;
kvn@4001 3874 __ vdivpd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 3875 %}
kvn@4001 3876 ins_pipe( pipe_slow );
kvn@4001 3877 %}
kvn@4001 3878
kvn@4001 3879 instruct vdiv4D_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 3880 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3881 match(Set dst (DivVD src (LoadVector mem)));
kvn@4001 3882 format %{ "vdivpd $dst,$src,$mem\t! div packed4D" %}
kvn@4001 3883 ins_encode %{
kvn@4001 3884 bool vector256 = true;
kvn@4001 3885 __ vdivpd($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 3886 %}
kvn@4001 3887 ins_pipe( pipe_slow );
kvn@4001 3888 %}
kvn@4001 3889
kvn@4134 3890 // ------------------------------ Shift ---------------------------------------
kvn@4134 3891
kvn@4134 3892 // Left and right shift count vectors are the same on x86
kvn@4134 3893 // (only lowest bits of xmm reg are used for count).
kvn@4134 3894 instruct vshiftcnt(vecS dst, rRegI cnt) %{
kvn@4134 3895 match(Set dst (LShiftCntV cnt));
kvn@4134 3896 match(Set dst (RShiftCntV cnt));
kvn@4134 3897 format %{ "movd $dst,$cnt\t! load shift count" %}
kvn@4134 3898 ins_encode %{
kvn@4134 3899 __ movdl($dst$$XMMRegister, $cnt$$Register);
kvn@4134 3900 %}
kvn@4134 3901 ins_pipe( pipe_slow );
kvn@4134 3902 %}
kvn@4134 3903
kvn@4001 3904 // ------------------------------ LeftShift -----------------------------------
kvn@4001 3905
kvn@4001 3906 // Shorts/Chars vector left shift
kvn@4134 3907 instruct vsll2S(vecS dst, vecS shift) %{
kvn@4001 3908 predicate(n->as_Vector()->length() == 2);
kvn@4001 3909 match(Set dst (LShiftVS dst shift));
kvn@4001 3910 format %{ "psllw $dst,$shift\t! left shift packed2S" %}
kvn@4001 3911 ins_encode %{
kvn@4001 3912 __ psllw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 3913 %}
kvn@4001 3914 ins_pipe( pipe_slow );
kvn@4001 3915 %}
kvn@4001 3916
kvn@4001 3917 instruct vsll2S_imm(vecS dst, immI8 shift) %{
kvn@4001 3918 predicate(n->as_Vector()->length() == 2);
kvn@4001 3919 match(Set dst (LShiftVS dst shift));
kvn@4001 3920 format %{ "psllw $dst,$shift\t! left shift packed2S" %}
kvn@4001 3921 ins_encode %{
kvn@4001 3922 __ psllw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 3923 %}
kvn@4001 3924 ins_pipe( pipe_slow );
kvn@4001 3925 %}
kvn@4001 3926
kvn@4134 3927 instruct vsll2S_reg(vecS dst, vecS src, vecS shift) %{
kvn@4001 3928 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3929 match(Set dst (LShiftVS src shift));
kvn@4001 3930 format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
kvn@4001 3931 ins_encode %{
kvn@4001 3932 bool vector256 = false;
kvn@4001 3933 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 3934 %}
kvn@4001 3935 ins_pipe( pipe_slow );
kvn@4001 3936 %}
kvn@4001 3937
kvn@4001 3938 instruct vsll2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
kvn@4001 3939 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 3940 match(Set dst (LShiftVS src shift));
kvn@4001 3941 format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
kvn@4001 3942 ins_encode %{
kvn@4001 3943 bool vector256 = false;
kvn@4001 3944 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 3945 %}
kvn@4001 3946 ins_pipe( pipe_slow );
kvn@4001 3947 %}
kvn@4001 3948
kvn@4134 3949 instruct vsll4S(vecD dst, vecS shift) %{
kvn@4001 3950 predicate(n->as_Vector()->length() == 4);
kvn@4001 3951 match(Set dst (LShiftVS dst shift));
kvn@4001 3952 format %{ "psllw $dst,$shift\t! left shift packed4S" %}
kvn@4001 3953 ins_encode %{
kvn@4001 3954 __ psllw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 3955 %}
kvn@4001 3956 ins_pipe( pipe_slow );
kvn@4001 3957 %}
kvn@4001 3958
kvn@4001 3959 instruct vsll4S_imm(vecD dst, immI8 shift) %{
kvn@4001 3960 predicate(n->as_Vector()->length() == 4);
kvn@4001 3961 match(Set dst (LShiftVS dst shift));
kvn@4001 3962 format %{ "psllw $dst,$shift\t! left shift packed4S" %}
kvn@4001 3963 ins_encode %{
kvn@4001 3964 __ psllw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 3965 %}
kvn@4001 3966 ins_pipe( pipe_slow );
kvn@4001 3967 %}
kvn@4001 3968
kvn@4134 3969 instruct vsll4S_reg(vecD dst, vecD src, vecS shift) %{
kvn@4001 3970 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3971 match(Set dst (LShiftVS src shift));
kvn@4001 3972 format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
kvn@4001 3973 ins_encode %{
kvn@4001 3974 bool vector256 = false;
kvn@4001 3975 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 3976 %}
kvn@4001 3977 ins_pipe( pipe_slow );
kvn@4001 3978 %}
kvn@4001 3979
kvn@4001 3980 instruct vsll4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4001 3981 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 3982 match(Set dst (LShiftVS src shift));
kvn@4001 3983 format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
kvn@4001 3984 ins_encode %{
kvn@4001 3985 bool vector256 = false;
kvn@4001 3986 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 3987 %}
kvn@4001 3988 ins_pipe( pipe_slow );
kvn@4001 3989 %}
kvn@4001 3990
kvn@4134 3991 instruct vsll8S(vecX dst, vecS shift) %{
kvn@4001 3992 predicate(n->as_Vector()->length() == 8);
kvn@4001 3993 match(Set dst (LShiftVS dst shift));
kvn@4001 3994 format %{ "psllw $dst,$shift\t! left shift packed8S" %}
kvn@4001 3995 ins_encode %{
kvn@4001 3996 __ psllw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 3997 %}
kvn@4001 3998 ins_pipe( pipe_slow );
kvn@4001 3999 %}
kvn@4001 4000
kvn@4001 4001 instruct vsll8S_imm(vecX dst, immI8 shift) %{
kvn@4001 4002 predicate(n->as_Vector()->length() == 8);
kvn@4001 4003 match(Set dst (LShiftVS dst shift));
kvn@4001 4004 format %{ "psllw $dst,$shift\t! left shift packed8S" %}
kvn@4001 4005 ins_encode %{
kvn@4001 4006 __ psllw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4007 %}
kvn@4001 4008 ins_pipe( pipe_slow );
kvn@4001 4009 %}
kvn@4001 4010
kvn@4134 4011 instruct vsll8S_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4012 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 4013 match(Set dst (LShiftVS src shift));
kvn@4001 4014 format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
kvn@4001 4015 ins_encode %{
kvn@4001 4016 bool vector256 = false;
kvn@4001 4017 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4018 %}
kvn@4001 4019 ins_pipe( pipe_slow );
kvn@4001 4020 %}
kvn@4001 4021
kvn@4001 4022 instruct vsll8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4023 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 4024 match(Set dst (LShiftVS src shift));
kvn@4001 4025 format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
kvn@4001 4026 ins_encode %{
kvn@4001 4027 bool vector256 = false;
kvn@4001 4028 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4029 %}
kvn@4001 4030 ins_pipe( pipe_slow );
kvn@4001 4031 %}
kvn@4001 4032
kvn@4134 4033 instruct vsll16S_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4034 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 4035 match(Set dst (LShiftVS src shift));
kvn@4001 4036 format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
kvn@4001 4037 ins_encode %{
kvn@4001 4038 bool vector256 = true;
kvn@4001 4039 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4040 %}
kvn@4001 4041 ins_pipe( pipe_slow );
kvn@4001 4042 %}
kvn@4001 4043
kvn@4001 4044 instruct vsll16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4045 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 4046 match(Set dst (LShiftVS src shift));
kvn@4001 4047 format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
kvn@4001 4048 ins_encode %{
kvn@4001 4049 bool vector256 = true;
kvn@4001 4050 __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4051 %}
kvn@4001 4052 ins_pipe( pipe_slow );
kvn@4001 4053 %}
kvn@4001 4054
kvn@4001 4055 // Integers vector left shift
kvn@4134 4056 instruct vsll2I(vecD dst, vecS shift) %{
kvn@4001 4057 predicate(n->as_Vector()->length() == 2);
kvn@4001 4058 match(Set dst (LShiftVI dst shift));
kvn@4001 4059 format %{ "pslld $dst,$shift\t! left shift packed2I" %}
kvn@4001 4060 ins_encode %{
kvn@4001 4061 __ pslld($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4062 %}
kvn@4001 4063 ins_pipe( pipe_slow );
kvn@4001 4064 %}
kvn@4001 4065
kvn@4001 4066 instruct vsll2I_imm(vecD dst, immI8 shift) %{
kvn@4001 4067 predicate(n->as_Vector()->length() == 2);
kvn@4001 4068 match(Set dst (LShiftVI dst shift));
kvn@4001 4069 format %{ "pslld $dst,$shift\t! left shift packed2I" %}
kvn@4001 4070 ins_encode %{
kvn@4001 4071 __ pslld($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4072 %}
kvn@4001 4073 ins_pipe( pipe_slow );
kvn@4001 4074 %}
kvn@4001 4075
kvn@4134 4076 instruct vsll2I_reg(vecD dst, vecD src, vecS shift) %{
kvn@4001 4077 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4078 match(Set dst (LShiftVI src shift));
kvn@4001 4079 format %{ "vpslld $dst,$src,$shift\t! left shift packed2I" %}
kvn@4001 4080 ins_encode %{
kvn@4001 4081 bool vector256 = false;
kvn@4001 4082 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4083 %}
kvn@4001 4084 ins_pipe( pipe_slow );
kvn@4001 4085 %}
kvn@4001 4086
kvn@4001 4087 instruct vsll2I_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4001 4088 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4089 match(Set dst (LShiftVI src shift));
kvn@4001 4090 format %{ "vpslld $dst,$src,$shift\t! left shift packed2I" %}
kvn@4001 4091 ins_encode %{
kvn@4001 4092 bool vector256 = false;
kvn@4001 4093 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4094 %}
kvn@4001 4095 ins_pipe( pipe_slow );
kvn@4001 4096 %}
kvn@4001 4097
kvn@4134 4098 instruct vsll4I(vecX dst, vecS shift) %{
kvn@4001 4099 predicate(n->as_Vector()->length() == 4);
kvn@4001 4100 match(Set dst (LShiftVI dst shift));
kvn@4001 4101 format %{ "pslld $dst,$shift\t! left shift packed4I" %}
kvn@4001 4102 ins_encode %{
kvn@4001 4103 __ pslld($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4104 %}
kvn@4001 4105 ins_pipe( pipe_slow );
kvn@4001 4106 %}
kvn@4001 4107
kvn@4001 4108 instruct vsll4I_imm(vecX dst, immI8 shift) %{
kvn@4001 4109 predicate(n->as_Vector()->length() == 4);
kvn@4001 4110 match(Set dst (LShiftVI dst shift));
kvn@4001 4111 format %{ "pslld $dst,$shift\t! left shift packed4I" %}
kvn@4001 4112 ins_encode %{
kvn@4001 4113 __ pslld($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4114 %}
kvn@4001 4115 ins_pipe( pipe_slow );
kvn@4001 4116 %}
kvn@4001 4117
kvn@4134 4118 instruct vsll4I_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4119 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4120 match(Set dst (LShiftVI src shift));
kvn@4001 4121 format %{ "vpslld $dst,$src,$shift\t! left shift packed4I" %}
kvn@4001 4122 ins_encode %{
kvn@4001 4123 bool vector256 = false;
kvn@4001 4124 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4125 %}
kvn@4001 4126 ins_pipe( pipe_slow );
kvn@4001 4127 %}
kvn@4001 4128
kvn@4001 4129 instruct vsll4I_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4130 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4131 match(Set dst (LShiftVI src shift));
kvn@4001 4132 format %{ "vpslld $dst,$src,$shift\t! left shift packed4I" %}
kvn@4001 4133 ins_encode %{
kvn@4001 4134 bool vector256 = false;
kvn@4001 4135 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4136 %}
kvn@4001 4137 ins_pipe( pipe_slow );
kvn@4001 4138 %}
kvn@4001 4139
kvn@4134 4140 instruct vsll8I_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4141 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4142 match(Set dst (LShiftVI src shift));
kvn@4001 4143 format %{ "vpslld $dst,$src,$shift\t! left shift packed8I" %}
kvn@4001 4144 ins_encode %{
kvn@4001 4145 bool vector256 = true;
kvn@4001 4146 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4147 %}
kvn@4001 4148 ins_pipe( pipe_slow );
kvn@4001 4149 %}
kvn@4001 4150
kvn@4001 4151 instruct vsll8I_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4152 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4153 match(Set dst (LShiftVI src shift));
kvn@4001 4154 format %{ "vpslld $dst,$src,$shift\t! left shift packed8I" %}
kvn@4001 4155 ins_encode %{
kvn@4001 4156 bool vector256 = true;
kvn@4001 4157 __ vpslld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4158 %}
kvn@4001 4159 ins_pipe( pipe_slow );
kvn@4001 4160 %}
kvn@4001 4161
kvn@4001 4162 // Longs vector left shift
kvn@4134 4163 instruct vsll2L(vecX dst, vecS shift) %{
kvn@4001 4164 predicate(n->as_Vector()->length() == 2);
kvn@4001 4165 match(Set dst (LShiftVL dst shift));
kvn@4001 4166 format %{ "psllq $dst,$shift\t! left shift packed2L" %}
kvn@4001 4167 ins_encode %{
kvn@4001 4168 __ psllq($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4169 %}
kvn@4001 4170 ins_pipe( pipe_slow );
kvn@4001 4171 %}
kvn@4001 4172
kvn@4001 4173 instruct vsll2L_imm(vecX dst, immI8 shift) %{
kvn@4001 4174 predicate(n->as_Vector()->length() == 2);
kvn@4001 4175 match(Set dst (LShiftVL dst shift));
kvn@4001 4176 format %{ "psllq $dst,$shift\t! left shift packed2L" %}
kvn@4001 4177 ins_encode %{
kvn@4001 4178 __ psllq($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4179 %}
kvn@4001 4180 ins_pipe( pipe_slow );
kvn@4001 4181 %}
kvn@4001 4182
kvn@4134 4183 instruct vsll2L_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4184 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4185 match(Set dst (LShiftVL src shift));
kvn@4001 4186 format %{ "vpsllq $dst,$src,$shift\t! left shift packed2L" %}
kvn@4001 4187 ins_encode %{
kvn@4001 4188 bool vector256 = false;
kvn@4001 4189 __ vpsllq($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4190 %}
kvn@4001 4191 ins_pipe( pipe_slow );
kvn@4001 4192 %}
kvn@4001 4193
kvn@4001 4194 instruct vsll2L_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4195 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4196 match(Set dst (LShiftVL src shift));
kvn@4001 4197 format %{ "vpsllq $dst,$src,$shift\t! left shift packed2L" %}
kvn@4001 4198 ins_encode %{
kvn@4001 4199 bool vector256 = false;
kvn@4001 4200 __ vpsllq($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4201 %}
kvn@4001 4202 ins_pipe( pipe_slow );
kvn@4001 4203 %}
kvn@4001 4204
kvn@4134 4205 instruct vsll4L_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4206 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 4207 match(Set dst (LShiftVL src shift));
kvn@4001 4208 format %{ "vpsllq $dst,$src,$shift\t! left shift packed4L" %}
kvn@4001 4209 ins_encode %{
kvn@4001 4210 bool vector256 = true;
kvn@4001 4211 __ vpsllq($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4212 %}
kvn@4001 4213 ins_pipe( pipe_slow );
kvn@4001 4214 %}
kvn@4001 4215
kvn@4001 4216 instruct vsll4L_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4217 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 4218 match(Set dst (LShiftVL src shift));
kvn@4001 4219 format %{ "vpsllq $dst,$src,$shift\t! left shift packed4L" %}
kvn@4001 4220 ins_encode %{
kvn@4001 4221 bool vector256 = true;
kvn@4001 4222 __ vpsllq($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4223 %}
kvn@4001 4224 ins_pipe( pipe_slow );
kvn@4001 4225 %}
kvn@4001 4226
kvn@4001 4227 // ----------------------- LogicalRightShift -----------------------------------
kvn@4001 4228
kvn@4204 4229 // Shorts vector logical right shift produces incorrect Java result
kvn@4001 4230 // for negative data because java code convert short value into int with
kvn@4204 4231 // sign extension before a shift. But char vectors are fine since chars are
kvn@4204 4232 // unsigned values.
kvn@4204 4233
kvn@4204 4234 instruct vsrl2S(vecS dst, vecS shift) %{
kvn@4204 4235 predicate(n->as_Vector()->length() == 2);
kvn@4204 4236 match(Set dst (URShiftVS dst shift));
kvn@4204 4237 format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %}
kvn@4204 4238 ins_encode %{
kvn@4204 4239 __ psrlw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4204 4240 %}
kvn@4204 4241 ins_pipe( pipe_slow );
kvn@4204 4242 %}
kvn@4204 4243
kvn@4204 4244 instruct vsrl2S_imm(vecS dst, immI8 shift) %{
kvn@4204 4245 predicate(n->as_Vector()->length() == 2);
kvn@4204 4246 match(Set dst (URShiftVS dst shift));
kvn@4204 4247 format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %}
kvn@4204 4248 ins_encode %{
kvn@4204 4249 __ psrlw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4204 4250 %}
kvn@4204 4251 ins_pipe( pipe_slow );
kvn@4204 4252 %}
kvn@4204 4253
kvn@4204 4254 instruct vsrl2S_reg(vecS dst, vecS src, vecS shift) %{
kvn@4204 4255 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4204 4256 match(Set dst (URShiftVS src shift));
kvn@4204 4257 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
kvn@4204 4258 ins_encode %{
kvn@4204 4259 bool vector256 = false;
kvn@4204 4260 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4204 4261 %}
kvn@4204 4262 ins_pipe( pipe_slow );
kvn@4204 4263 %}
kvn@4204 4264
kvn@4204 4265 instruct vsrl2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
kvn@4204 4266 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4204 4267 match(Set dst (URShiftVS src shift));
kvn@4204 4268 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
kvn@4204 4269 ins_encode %{
kvn@4204 4270 bool vector256 = false;
kvn@4204 4271 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4204 4272 %}
kvn@4204 4273 ins_pipe( pipe_slow );
kvn@4204 4274 %}
kvn@4204 4275
kvn@4204 4276 instruct vsrl4S(vecD dst, vecS shift) %{
kvn@4204 4277 predicate(n->as_Vector()->length() == 4);
kvn@4204 4278 match(Set dst (URShiftVS dst shift));
kvn@4204 4279 format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %}
kvn@4204 4280 ins_encode %{
kvn@4204 4281 __ psrlw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4204 4282 %}
kvn@4204 4283 ins_pipe( pipe_slow );
kvn@4204 4284 %}
kvn@4204 4285
kvn@4204 4286 instruct vsrl4S_imm(vecD dst, immI8 shift) %{
kvn@4204 4287 predicate(n->as_Vector()->length() == 4);
kvn@4204 4288 match(Set dst (URShiftVS dst shift));
kvn@4204 4289 format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %}
kvn@4204 4290 ins_encode %{
kvn@4204 4291 __ psrlw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4204 4292 %}
kvn@4204 4293 ins_pipe( pipe_slow );
kvn@4204 4294 %}
kvn@4204 4295
kvn@4204 4296 instruct vsrl4S_reg(vecD dst, vecD src, vecS shift) %{
kvn@4204 4297 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4204 4298 match(Set dst (URShiftVS src shift));
kvn@4204 4299 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
kvn@4204 4300 ins_encode %{
kvn@4204 4301 bool vector256 = false;
kvn@4204 4302 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4204 4303 %}
kvn@4204 4304 ins_pipe( pipe_slow );
kvn@4204 4305 %}
kvn@4204 4306
kvn@4204 4307 instruct vsrl4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4204 4308 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4204 4309 match(Set dst (URShiftVS src shift));
kvn@4204 4310 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
kvn@4204 4311 ins_encode %{
kvn@4204 4312 bool vector256 = false;
kvn@4204 4313 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4204 4314 %}
kvn@4204 4315 ins_pipe( pipe_slow );
kvn@4204 4316 %}
kvn@4204 4317
kvn@4204 4318 instruct vsrl8S(vecX dst, vecS shift) %{
kvn@4204 4319 predicate(n->as_Vector()->length() == 8);
kvn@4204 4320 match(Set dst (URShiftVS dst shift));
kvn@4204 4321 format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %}
kvn@4204 4322 ins_encode %{
kvn@4204 4323 __ psrlw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4204 4324 %}
kvn@4204 4325 ins_pipe( pipe_slow );
kvn@4204 4326 %}
kvn@4204 4327
kvn@4204 4328 instruct vsrl8S_imm(vecX dst, immI8 shift) %{
kvn@4204 4329 predicate(n->as_Vector()->length() == 8);
kvn@4204 4330 match(Set dst (URShiftVS dst shift));
kvn@4204 4331 format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %}
kvn@4204 4332 ins_encode %{
kvn@4204 4333 __ psrlw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4204 4334 %}
kvn@4204 4335 ins_pipe( pipe_slow );
kvn@4204 4336 %}
kvn@4204 4337
kvn@4204 4338 instruct vsrl8S_reg(vecX dst, vecX src, vecS shift) %{
kvn@4204 4339 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4204 4340 match(Set dst (URShiftVS src shift));
kvn@4204 4341 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
kvn@4204 4342 ins_encode %{
kvn@4204 4343 bool vector256 = false;
kvn@4204 4344 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4204 4345 %}
kvn@4204 4346 ins_pipe( pipe_slow );
kvn@4204 4347 %}
kvn@4204 4348
kvn@4204 4349 instruct vsrl8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4204 4350 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4204 4351 match(Set dst (URShiftVS src shift));
kvn@4204 4352 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
kvn@4204 4353 ins_encode %{
kvn@4204 4354 bool vector256 = false;
kvn@4204 4355 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4204 4356 %}
kvn@4204 4357 ins_pipe( pipe_slow );
kvn@4204 4358 %}
kvn@4204 4359
kvn@4204 4360 instruct vsrl16S_reg(vecY dst, vecY src, vecS shift) %{
kvn@4204 4361 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4204 4362 match(Set dst (URShiftVS src shift));
kvn@4204 4363 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
kvn@4204 4364 ins_encode %{
kvn@4204 4365 bool vector256 = true;
kvn@4204 4366 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4204 4367 %}
kvn@4204 4368 ins_pipe( pipe_slow );
kvn@4204 4369 %}
kvn@4204 4370
kvn@4204 4371 instruct vsrl16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4204 4372 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4204 4373 match(Set dst (URShiftVS src shift));
kvn@4204 4374 format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
kvn@4204 4375 ins_encode %{
kvn@4204 4376 bool vector256 = true;
kvn@4204 4377 __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4204 4378 %}
kvn@4204 4379 ins_pipe( pipe_slow );
kvn@4204 4380 %}
kvn@4001 4381
kvn@4001 4382 // Integers vector logical right shift
kvn@4134 4383 instruct vsrl2I(vecD dst, vecS shift) %{
kvn@4001 4384 predicate(n->as_Vector()->length() == 2);
kvn@4001 4385 match(Set dst (URShiftVI dst shift));
kvn@4001 4386 format %{ "psrld $dst,$shift\t! logical right shift packed2I" %}
kvn@4001 4387 ins_encode %{
kvn@4001 4388 __ psrld($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4389 %}
kvn@4001 4390 ins_pipe( pipe_slow );
kvn@4001 4391 %}
kvn@4001 4392
kvn@4001 4393 instruct vsrl2I_imm(vecD dst, immI8 shift) %{
kvn@4001 4394 predicate(n->as_Vector()->length() == 2);
kvn@4001 4395 match(Set dst (URShiftVI dst shift));
kvn@4001 4396 format %{ "psrld $dst,$shift\t! logical right shift packed2I" %}
kvn@4001 4397 ins_encode %{
kvn@4001 4398 __ psrld($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4399 %}
kvn@4001 4400 ins_pipe( pipe_slow );
kvn@4001 4401 %}
kvn@4001 4402
kvn@4134 4403 instruct vsrl2I_reg(vecD dst, vecD src, vecS shift) %{
kvn@4001 4404 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4405 match(Set dst (URShiftVI src shift));
kvn@4001 4406 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed2I" %}
kvn@4001 4407 ins_encode %{
kvn@4001 4408 bool vector256 = false;
kvn@4001 4409 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4410 %}
kvn@4001 4411 ins_pipe( pipe_slow );
kvn@4001 4412 %}
kvn@4001 4413
kvn@4001 4414 instruct vsrl2I_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4001 4415 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4416 match(Set dst (URShiftVI src shift));
kvn@4001 4417 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed2I" %}
kvn@4001 4418 ins_encode %{
kvn@4001 4419 bool vector256 = false;
kvn@4001 4420 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4421 %}
kvn@4001 4422 ins_pipe( pipe_slow );
kvn@4001 4423 %}
kvn@4001 4424
kvn@4134 4425 instruct vsrl4I(vecX dst, vecS shift) %{
kvn@4001 4426 predicate(n->as_Vector()->length() == 4);
kvn@4001 4427 match(Set dst (URShiftVI dst shift));
kvn@4001 4428 format %{ "psrld $dst,$shift\t! logical right shift packed4I" %}
kvn@4001 4429 ins_encode %{
kvn@4001 4430 __ psrld($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4431 %}
kvn@4001 4432 ins_pipe( pipe_slow );
kvn@4001 4433 %}
kvn@4001 4434
kvn@4001 4435 instruct vsrl4I_imm(vecX dst, immI8 shift) %{
kvn@4001 4436 predicate(n->as_Vector()->length() == 4);
kvn@4001 4437 match(Set dst (URShiftVI dst shift));
kvn@4001 4438 format %{ "psrld $dst,$shift\t! logical right shift packed4I" %}
kvn@4001 4439 ins_encode %{
kvn@4001 4440 __ psrld($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4441 %}
kvn@4001 4442 ins_pipe( pipe_slow );
kvn@4001 4443 %}
kvn@4001 4444
kvn@4134 4445 instruct vsrl4I_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4446 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4447 match(Set dst (URShiftVI src shift));
kvn@4001 4448 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed4I" %}
kvn@4001 4449 ins_encode %{
kvn@4001 4450 bool vector256 = false;
kvn@4001 4451 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4452 %}
kvn@4001 4453 ins_pipe( pipe_slow );
kvn@4001 4454 %}
kvn@4001 4455
kvn@4001 4456 instruct vsrl4I_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4457 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4458 match(Set dst (URShiftVI src shift));
kvn@4001 4459 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed4I" %}
kvn@4001 4460 ins_encode %{
kvn@4001 4461 bool vector256 = false;
kvn@4001 4462 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4463 %}
kvn@4001 4464 ins_pipe( pipe_slow );
kvn@4001 4465 %}
kvn@4001 4466
kvn@4134 4467 instruct vsrl8I_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4468 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4469 match(Set dst (URShiftVI src shift));
kvn@4001 4470 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed8I" %}
kvn@4001 4471 ins_encode %{
kvn@4001 4472 bool vector256 = true;
kvn@4001 4473 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4474 %}
kvn@4001 4475 ins_pipe( pipe_slow );
kvn@4001 4476 %}
kvn@4001 4477
kvn@4001 4478 instruct vsrl8I_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4479 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4480 match(Set dst (URShiftVI src shift));
kvn@4001 4481 format %{ "vpsrld $dst,$src,$shift\t! logical right shift packed8I" %}
kvn@4001 4482 ins_encode %{
kvn@4001 4483 bool vector256 = true;
kvn@4001 4484 __ vpsrld($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4485 %}
kvn@4001 4486 ins_pipe( pipe_slow );
kvn@4001 4487 %}
kvn@4001 4488
kvn@4001 4489 // Longs vector logical right shift
kvn@4134 4490 instruct vsrl2L(vecX dst, vecS shift) %{
kvn@4001 4491 predicate(n->as_Vector()->length() == 2);
kvn@4001 4492 match(Set dst (URShiftVL dst shift));
kvn@4001 4493 format %{ "psrlq $dst,$shift\t! logical right shift packed2L" %}
kvn@4001 4494 ins_encode %{
kvn@4001 4495 __ psrlq($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4496 %}
kvn@4001 4497 ins_pipe( pipe_slow );
kvn@4001 4498 %}
kvn@4001 4499
kvn@4001 4500 instruct vsrl2L_imm(vecX dst, immI8 shift) %{
kvn@4001 4501 predicate(n->as_Vector()->length() == 2);
kvn@4001 4502 match(Set dst (URShiftVL dst shift));
kvn@4001 4503 format %{ "psrlq $dst,$shift\t! logical right shift packed2L" %}
kvn@4001 4504 ins_encode %{
kvn@4001 4505 __ psrlq($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4506 %}
kvn@4001 4507 ins_pipe( pipe_slow );
kvn@4001 4508 %}
kvn@4001 4509
kvn@4134 4510 instruct vsrl2L_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4511 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4512 match(Set dst (URShiftVL src shift));
kvn@4001 4513 format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed2L" %}
kvn@4001 4514 ins_encode %{
kvn@4001 4515 bool vector256 = false;
kvn@4001 4516 __ vpsrlq($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4517 %}
kvn@4001 4518 ins_pipe( pipe_slow );
kvn@4001 4519 %}
kvn@4001 4520
kvn@4001 4521 instruct vsrl2L_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4522 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4523 match(Set dst (URShiftVL src shift));
kvn@4001 4524 format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed2L" %}
kvn@4001 4525 ins_encode %{
kvn@4001 4526 bool vector256 = false;
kvn@4001 4527 __ vpsrlq($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4528 %}
kvn@4001 4529 ins_pipe( pipe_slow );
kvn@4001 4530 %}
kvn@4001 4531
kvn@4134 4532 instruct vsrl4L_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4533 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 4534 match(Set dst (URShiftVL src shift));
kvn@4001 4535 format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed4L" %}
kvn@4001 4536 ins_encode %{
kvn@4001 4537 bool vector256 = true;
kvn@4001 4538 __ vpsrlq($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4539 %}
kvn@4001 4540 ins_pipe( pipe_slow );
kvn@4001 4541 %}
kvn@4001 4542
kvn@4001 4543 instruct vsrl4L_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4544 predicate(UseAVX > 1 && n->as_Vector()->length() == 4);
kvn@4001 4545 match(Set dst (URShiftVL src shift));
kvn@4001 4546 format %{ "vpsrlq $dst,$src,$shift\t! logical right shift packed4L" %}
kvn@4001 4547 ins_encode %{
kvn@4001 4548 bool vector256 = true;
kvn@4001 4549 __ vpsrlq($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4550 %}
kvn@4001 4551 ins_pipe( pipe_slow );
kvn@4001 4552 %}
kvn@4001 4553
kvn@4001 4554 // ------------------- ArithmeticRightShift -----------------------------------
kvn@4001 4555
kvn@4001 4556 // Shorts/Chars vector arithmetic right shift
kvn@4134 4557 instruct vsra2S(vecS dst, vecS shift) %{
kvn@4001 4558 predicate(n->as_Vector()->length() == 2);
kvn@4001 4559 match(Set dst (RShiftVS dst shift));
kvn@4001 4560 format %{ "psraw $dst,$shift\t! arithmetic right shift packed2S" %}
kvn@4001 4561 ins_encode %{
kvn@4001 4562 __ psraw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4563 %}
kvn@4001 4564 ins_pipe( pipe_slow );
kvn@4001 4565 %}
kvn@4001 4566
kvn@4001 4567 instruct vsra2S_imm(vecS dst, immI8 shift) %{
kvn@4001 4568 predicate(n->as_Vector()->length() == 2);
kvn@4001 4569 match(Set dst (RShiftVS dst shift));
kvn@4001 4570 format %{ "psraw $dst,$shift\t! arithmetic right shift packed2S" %}
kvn@4001 4571 ins_encode %{
kvn@4001 4572 __ psraw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4573 %}
kvn@4001 4574 ins_pipe( pipe_slow );
kvn@4001 4575 %}
kvn@4001 4576
kvn@4134 4577 instruct vsra2S_reg(vecS dst, vecS src, vecS shift) %{
kvn@4001 4578 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4579 match(Set dst (RShiftVS src shift));
kvn@4001 4580 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
kvn@4001 4581 ins_encode %{
kvn@4001 4582 bool vector256 = false;
kvn@4001 4583 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4584 %}
kvn@4001 4585 ins_pipe( pipe_slow );
kvn@4001 4586 %}
kvn@4001 4587
kvn@4001 4588 instruct vsra2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
kvn@4001 4589 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4590 match(Set dst (RShiftVS src shift));
kvn@4001 4591 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
kvn@4001 4592 ins_encode %{
kvn@4001 4593 bool vector256 = false;
kvn@4001 4594 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4595 %}
kvn@4001 4596 ins_pipe( pipe_slow );
kvn@4001 4597 %}
kvn@4001 4598
kvn@4134 4599 instruct vsra4S(vecD dst, vecS shift) %{
kvn@4001 4600 predicate(n->as_Vector()->length() == 4);
kvn@4001 4601 match(Set dst (RShiftVS dst shift));
kvn@4001 4602 format %{ "psraw $dst,$shift\t! arithmetic right shift packed4S" %}
kvn@4001 4603 ins_encode %{
kvn@4001 4604 __ psraw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4605 %}
kvn@4001 4606 ins_pipe( pipe_slow );
kvn@4001 4607 %}
kvn@4001 4608
kvn@4001 4609 instruct vsra4S_imm(vecD dst, immI8 shift) %{
kvn@4001 4610 predicate(n->as_Vector()->length() == 4);
kvn@4001 4611 match(Set dst (RShiftVS dst shift));
kvn@4001 4612 format %{ "psraw $dst,$shift\t! arithmetic right shift packed4S" %}
kvn@4001 4613 ins_encode %{
kvn@4001 4614 __ psraw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4615 %}
kvn@4001 4616 ins_pipe( pipe_slow );
kvn@4001 4617 %}
kvn@4001 4618
kvn@4134 4619 instruct vsra4S_reg(vecD dst, vecD src, vecS shift) %{
kvn@4001 4620 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4621 match(Set dst (RShiftVS src shift));
kvn@4001 4622 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
kvn@4001 4623 ins_encode %{
kvn@4001 4624 bool vector256 = false;
kvn@4001 4625 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4626 %}
kvn@4001 4627 ins_pipe( pipe_slow );
kvn@4001 4628 %}
kvn@4001 4629
kvn@4001 4630 instruct vsra4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4001 4631 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4632 match(Set dst (RShiftVS src shift));
kvn@4001 4633 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
kvn@4001 4634 ins_encode %{
kvn@4001 4635 bool vector256 = false;
kvn@4001 4636 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4637 %}
kvn@4001 4638 ins_pipe( pipe_slow );
kvn@4001 4639 %}
kvn@4001 4640
kvn@4134 4641 instruct vsra8S(vecX dst, vecS shift) %{
kvn@4001 4642 predicate(n->as_Vector()->length() == 8);
kvn@4001 4643 match(Set dst (RShiftVS dst shift));
kvn@4001 4644 format %{ "psraw $dst,$shift\t! arithmetic right shift packed8S" %}
kvn@4001 4645 ins_encode %{
kvn@4001 4646 __ psraw($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4647 %}
kvn@4001 4648 ins_pipe( pipe_slow );
kvn@4001 4649 %}
kvn@4001 4650
kvn@4001 4651 instruct vsra8S_imm(vecX dst, immI8 shift) %{
kvn@4001 4652 predicate(n->as_Vector()->length() == 8);
kvn@4001 4653 match(Set dst (RShiftVS dst shift));
kvn@4001 4654 format %{ "psraw $dst,$shift\t! arithmetic right shift packed8S" %}
kvn@4001 4655 ins_encode %{
kvn@4001 4656 __ psraw($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4657 %}
kvn@4001 4658 ins_pipe( pipe_slow );
kvn@4001 4659 %}
kvn@4001 4660
kvn@4134 4661 instruct vsra8S_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4662 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 4663 match(Set dst (RShiftVS src shift));
kvn@4001 4664 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
kvn@4001 4665 ins_encode %{
kvn@4001 4666 bool vector256 = false;
kvn@4001 4667 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4668 %}
kvn@4001 4669 ins_pipe( pipe_slow );
kvn@4001 4670 %}
kvn@4001 4671
kvn@4001 4672 instruct vsra8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4673 predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
kvn@4001 4674 match(Set dst (RShiftVS src shift));
kvn@4001 4675 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
kvn@4001 4676 ins_encode %{
kvn@4001 4677 bool vector256 = false;
kvn@4001 4678 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4679 %}
kvn@4001 4680 ins_pipe( pipe_slow );
kvn@4001 4681 %}
kvn@4001 4682
kvn@4134 4683 instruct vsra16S_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4684 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 4685 match(Set dst (RShiftVS src shift));
kvn@4001 4686 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
kvn@4001 4687 ins_encode %{
kvn@4001 4688 bool vector256 = true;
kvn@4001 4689 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4690 %}
kvn@4001 4691 ins_pipe( pipe_slow );
kvn@4001 4692 %}
kvn@4001 4693
kvn@4001 4694 instruct vsra16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4695 predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
kvn@4001 4696 match(Set dst (RShiftVS src shift));
kvn@4001 4697 format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
kvn@4001 4698 ins_encode %{
kvn@4001 4699 bool vector256 = true;
kvn@4001 4700 __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4701 %}
kvn@4001 4702 ins_pipe( pipe_slow );
kvn@4001 4703 %}
kvn@4001 4704
kvn@4001 4705 // Integers vector arithmetic right shift
kvn@4134 4706 instruct vsra2I(vecD dst, vecS shift) %{
kvn@4001 4707 predicate(n->as_Vector()->length() == 2);
kvn@4001 4708 match(Set dst (RShiftVI dst shift));
kvn@4001 4709 format %{ "psrad $dst,$shift\t! arithmetic right shift packed2I" %}
kvn@4001 4710 ins_encode %{
kvn@4001 4711 __ psrad($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4712 %}
kvn@4001 4713 ins_pipe( pipe_slow );
kvn@4001 4714 %}
kvn@4001 4715
kvn@4001 4716 instruct vsra2I_imm(vecD dst, immI8 shift) %{
kvn@4001 4717 predicate(n->as_Vector()->length() == 2);
kvn@4001 4718 match(Set dst (RShiftVI dst shift));
kvn@4001 4719 format %{ "psrad $dst,$shift\t! arithmetic right shift packed2I" %}
kvn@4001 4720 ins_encode %{
kvn@4001 4721 __ psrad($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4722 %}
kvn@4001 4723 ins_pipe( pipe_slow );
kvn@4001 4724 %}
kvn@4001 4725
kvn@4134 4726 instruct vsra2I_reg(vecD dst, vecD src, vecS shift) %{
kvn@4001 4727 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4728 match(Set dst (RShiftVI src shift));
kvn@4001 4729 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed2I" %}
kvn@4001 4730 ins_encode %{
kvn@4001 4731 bool vector256 = false;
kvn@4001 4732 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4733 %}
kvn@4001 4734 ins_pipe( pipe_slow );
kvn@4001 4735 %}
kvn@4001 4736
kvn@4001 4737 instruct vsra2I_reg_imm(vecD dst, vecD src, immI8 shift) %{
kvn@4001 4738 predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
kvn@4001 4739 match(Set dst (RShiftVI src shift));
kvn@4001 4740 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed2I" %}
kvn@4001 4741 ins_encode %{
kvn@4001 4742 bool vector256 = false;
kvn@4001 4743 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4744 %}
kvn@4001 4745 ins_pipe( pipe_slow );
kvn@4001 4746 %}
kvn@4001 4747
kvn@4134 4748 instruct vsra4I(vecX dst, vecS shift) %{
kvn@4001 4749 predicate(n->as_Vector()->length() == 4);
kvn@4001 4750 match(Set dst (RShiftVI dst shift));
kvn@4001 4751 format %{ "psrad $dst,$shift\t! arithmetic right shift packed4I" %}
kvn@4001 4752 ins_encode %{
kvn@4001 4753 __ psrad($dst$$XMMRegister, $shift$$XMMRegister);
kvn@4001 4754 %}
kvn@4001 4755 ins_pipe( pipe_slow );
kvn@4001 4756 %}
kvn@4001 4757
kvn@4001 4758 instruct vsra4I_imm(vecX dst, immI8 shift) %{
kvn@4001 4759 predicate(n->as_Vector()->length() == 4);
kvn@4001 4760 match(Set dst (RShiftVI dst shift));
kvn@4001 4761 format %{ "psrad $dst,$shift\t! arithmetic right shift packed4I" %}
kvn@4001 4762 ins_encode %{
kvn@4001 4763 __ psrad($dst$$XMMRegister, (int)$shift$$constant);
kvn@4001 4764 %}
kvn@4001 4765 ins_pipe( pipe_slow );
kvn@4001 4766 %}
kvn@4001 4767
kvn@4134 4768 instruct vsra4I_reg(vecX dst, vecX src, vecS shift) %{
kvn@4001 4769 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4770 match(Set dst (RShiftVI src shift));
kvn@4001 4771 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed4I" %}
kvn@4001 4772 ins_encode %{
kvn@4001 4773 bool vector256 = false;
kvn@4001 4774 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4775 %}
kvn@4001 4776 ins_pipe( pipe_slow );
kvn@4001 4777 %}
kvn@4001 4778
kvn@4001 4779 instruct vsra4I_reg_imm(vecX dst, vecX src, immI8 shift) %{
kvn@4001 4780 predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
kvn@4001 4781 match(Set dst (RShiftVI src shift));
kvn@4001 4782 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed4I" %}
kvn@4001 4783 ins_encode %{
kvn@4001 4784 bool vector256 = false;
kvn@4001 4785 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4786 %}
kvn@4001 4787 ins_pipe( pipe_slow );
kvn@4001 4788 %}
kvn@4001 4789
kvn@4134 4790 instruct vsra8I_reg(vecY dst, vecY src, vecS shift) %{
kvn@4001 4791 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4792 match(Set dst (RShiftVI src shift));
kvn@4001 4793 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed8I" %}
kvn@4001 4794 ins_encode %{
kvn@4001 4795 bool vector256 = true;
kvn@4001 4796 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256);
kvn@4001 4797 %}
kvn@4001 4798 ins_pipe( pipe_slow );
kvn@4001 4799 %}
kvn@4001 4800
kvn@4001 4801 instruct vsra8I_reg_imm(vecY dst, vecY src, immI8 shift) %{
kvn@4001 4802 predicate(UseAVX > 1 && n->as_Vector()->length() == 8);
kvn@4001 4803 match(Set dst (RShiftVI src shift));
kvn@4001 4804 format %{ "vpsrad $dst,$src,$shift\t! arithmetic right shift packed8I" %}
kvn@4001 4805 ins_encode %{
kvn@4001 4806 bool vector256 = true;
kvn@4001 4807 __ vpsrad($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256);
kvn@4001 4808 %}
kvn@4001 4809 ins_pipe( pipe_slow );
kvn@4001 4810 %}
kvn@4001 4811
kvn@4001 4812 // There are no longs vector arithmetic right shift instructions.
kvn@4001 4813
kvn@4001 4814
kvn@4001 4815 // --------------------------------- AND --------------------------------------
kvn@4001 4816
kvn@4001 4817 instruct vand4B(vecS dst, vecS src) %{
kvn@4001 4818 predicate(n->as_Vector()->length_in_bytes() == 4);
kvn@4001 4819 match(Set dst (AndV dst src));
kvn@4001 4820 format %{ "pand $dst,$src\t! and vectors (4 bytes)" %}
kvn@4001 4821 ins_encode %{
kvn@4001 4822 __ pand($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4823 %}
kvn@4001 4824 ins_pipe( pipe_slow );
kvn@4001 4825 %}
kvn@4001 4826
kvn@4001 4827 instruct vand4B_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 4828 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 4);
kvn@4001 4829 match(Set dst (AndV src1 src2));
kvn@4001 4830 format %{ "vpand $dst,$src1,$src2\t! and vectors (4 bytes)" %}
kvn@4001 4831 ins_encode %{
kvn@4001 4832 bool vector256 = false;
kvn@4001 4833 __ vpand($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4834 %}
kvn@4001 4835 ins_pipe( pipe_slow );
kvn@4001 4836 %}
kvn@4001 4837
kvn@4001 4838 instruct vand8B(vecD dst, vecD src) %{
kvn@4001 4839 predicate(n->as_Vector()->length_in_bytes() == 8);
kvn@4001 4840 match(Set dst (AndV dst src));
kvn@4001 4841 format %{ "pand $dst,$src\t! and vectors (8 bytes)" %}
kvn@4001 4842 ins_encode %{
kvn@4001 4843 __ pand($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4844 %}
kvn@4001 4845 ins_pipe( pipe_slow );
kvn@4001 4846 %}
kvn@4001 4847
kvn@4001 4848 instruct vand8B_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 4849 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 8);
kvn@4001 4850 match(Set dst (AndV src1 src2));
kvn@4001 4851 format %{ "vpand $dst,$src1,$src2\t! and vectors (8 bytes)" %}
kvn@4001 4852 ins_encode %{
kvn@4001 4853 bool vector256 = false;
kvn@4001 4854 __ vpand($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4855 %}
kvn@4001 4856 ins_pipe( pipe_slow );
kvn@4001 4857 %}
kvn@4001 4858
kvn@4001 4859 instruct vand16B(vecX dst, vecX src) %{
kvn@4001 4860 predicate(n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4861 match(Set dst (AndV dst src));
kvn@4001 4862 format %{ "pand $dst,$src\t! and vectors (16 bytes)" %}
kvn@4001 4863 ins_encode %{
kvn@4001 4864 __ pand($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4865 %}
kvn@4001 4866 ins_pipe( pipe_slow );
kvn@4001 4867 %}
kvn@4001 4868
kvn@4001 4869 instruct vand16B_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 4870 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4871 match(Set dst (AndV src1 src2));
kvn@4001 4872 format %{ "vpand $dst,$src1,$src2\t! and vectors (16 bytes)" %}
kvn@4001 4873 ins_encode %{
kvn@4001 4874 bool vector256 = false;
kvn@4001 4875 __ vpand($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4876 %}
kvn@4001 4877 ins_pipe( pipe_slow );
kvn@4001 4878 %}
kvn@4001 4879
kvn@4001 4880 instruct vand16B_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 4881 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4882 match(Set dst (AndV src (LoadVector mem)));
kvn@4001 4883 format %{ "vpand $dst,$src,$mem\t! and vectors (16 bytes)" %}
kvn@4001 4884 ins_encode %{
kvn@4001 4885 bool vector256 = false;
kvn@4001 4886 __ vpand($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 4887 %}
kvn@4001 4888 ins_pipe( pipe_slow );
kvn@4001 4889 %}
kvn@4001 4890
kvn@4001 4891 instruct vand32B_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 4892 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 4893 match(Set dst (AndV src1 src2));
kvn@4001 4894 format %{ "vpand $dst,$src1,$src2\t! and vectors (32 bytes)" %}
kvn@4001 4895 ins_encode %{
kvn@4001 4896 bool vector256 = true;
kvn@4001 4897 __ vpand($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4898 %}
kvn@4001 4899 ins_pipe( pipe_slow );
kvn@4001 4900 %}
kvn@4001 4901
kvn@4001 4902 instruct vand32B_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 4903 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 4904 match(Set dst (AndV src (LoadVector mem)));
kvn@4001 4905 format %{ "vpand $dst,$src,$mem\t! and vectors (32 bytes)" %}
kvn@4001 4906 ins_encode %{
kvn@4001 4907 bool vector256 = true;
kvn@4001 4908 __ vpand($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 4909 %}
kvn@4001 4910 ins_pipe( pipe_slow );
kvn@4001 4911 %}
kvn@4001 4912
kvn@4001 4913 // --------------------------------- OR ---------------------------------------
kvn@4001 4914
kvn@4001 4915 instruct vor4B(vecS dst, vecS src) %{
kvn@4001 4916 predicate(n->as_Vector()->length_in_bytes() == 4);
kvn@4001 4917 match(Set dst (OrV dst src));
kvn@4001 4918 format %{ "por $dst,$src\t! or vectors (4 bytes)" %}
kvn@4001 4919 ins_encode %{
kvn@4001 4920 __ por($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4921 %}
kvn@4001 4922 ins_pipe( pipe_slow );
kvn@4001 4923 %}
kvn@4001 4924
kvn@4001 4925 instruct vor4B_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 4926 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 4);
kvn@4001 4927 match(Set dst (OrV src1 src2));
kvn@4001 4928 format %{ "vpor $dst,$src1,$src2\t! or vectors (4 bytes)" %}
kvn@4001 4929 ins_encode %{
kvn@4001 4930 bool vector256 = false;
kvn@4001 4931 __ vpor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4932 %}
kvn@4001 4933 ins_pipe( pipe_slow );
kvn@4001 4934 %}
kvn@4001 4935
kvn@4001 4936 instruct vor8B(vecD dst, vecD src) %{
kvn@4001 4937 predicate(n->as_Vector()->length_in_bytes() == 8);
kvn@4001 4938 match(Set dst (OrV dst src));
kvn@4001 4939 format %{ "por $dst,$src\t! or vectors (8 bytes)" %}
kvn@4001 4940 ins_encode %{
kvn@4001 4941 __ por($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4942 %}
kvn@4001 4943 ins_pipe( pipe_slow );
kvn@4001 4944 %}
kvn@4001 4945
kvn@4001 4946 instruct vor8B_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 4947 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 8);
kvn@4001 4948 match(Set dst (OrV src1 src2));
kvn@4001 4949 format %{ "vpor $dst,$src1,$src2\t! or vectors (8 bytes)" %}
kvn@4001 4950 ins_encode %{
kvn@4001 4951 bool vector256 = false;
kvn@4001 4952 __ vpor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4953 %}
kvn@4001 4954 ins_pipe( pipe_slow );
kvn@4001 4955 %}
kvn@4001 4956
kvn@4001 4957 instruct vor16B(vecX dst, vecX src) %{
kvn@4001 4958 predicate(n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4959 match(Set dst (OrV dst src));
kvn@4001 4960 format %{ "por $dst,$src\t! or vectors (16 bytes)" %}
kvn@4001 4961 ins_encode %{
kvn@4001 4962 __ por($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 4963 %}
kvn@4001 4964 ins_pipe( pipe_slow );
kvn@4001 4965 %}
kvn@4001 4966
kvn@4001 4967 instruct vor16B_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 4968 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4969 match(Set dst (OrV src1 src2));
kvn@4001 4970 format %{ "vpor $dst,$src1,$src2\t! or vectors (16 bytes)" %}
kvn@4001 4971 ins_encode %{
kvn@4001 4972 bool vector256 = false;
kvn@4001 4973 __ vpor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4974 %}
kvn@4001 4975 ins_pipe( pipe_slow );
kvn@4001 4976 %}
kvn@4001 4977
kvn@4001 4978 instruct vor16B_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 4979 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 4980 match(Set dst (OrV src (LoadVector mem)));
kvn@4001 4981 format %{ "vpor $dst,$src,$mem\t! or vectors (16 bytes)" %}
kvn@4001 4982 ins_encode %{
kvn@4001 4983 bool vector256 = false;
kvn@4001 4984 __ vpor($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 4985 %}
kvn@4001 4986 ins_pipe( pipe_slow );
kvn@4001 4987 %}
kvn@4001 4988
kvn@4001 4989 instruct vor32B_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 4990 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 4991 match(Set dst (OrV src1 src2));
kvn@4001 4992 format %{ "vpor $dst,$src1,$src2\t! or vectors (32 bytes)" %}
kvn@4001 4993 ins_encode %{
kvn@4001 4994 bool vector256 = true;
kvn@4001 4995 __ vpor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 4996 %}
kvn@4001 4997 ins_pipe( pipe_slow );
kvn@4001 4998 %}
kvn@4001 4999
kvn@4001 5000 instruct vor32B_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 5001 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 5002 match(Set dst (OrV src (LoadVector mem)));
kvn@4001 5003 format %{ "vpor $dst,$src,$mem\t! or vectors (32 bytes)" %}
kvn@4001 5004 ins_encode %{
kvn@4001 5005 bool vector256 = true;
kvn@4001 5006 __ vpor($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 5007 %}
kvn@4001 5008 ins_pipe( pipe_slow );
kvn@4001 5009 %}
kvn@4001 5010
kvn@4001 5011 // --------------------------------- XOR --------------------------------------
kvn@4001 5012
kvn@4001 5013 instruct vxor4B(vecS dst, vecS src) %{
kvn@4001 5014 predicate(n->as_Vector()->length_in_bytes() == 4);
kvn@4001 5015 match(Set dst (XorV dst src));
kvn@4001 5016 format %{ "pxor $dst,$src\t! xor vectors (4 bytes)" %}
kvn@4001 5017 ins_encode %{
kvn@4001 5018 __ pxor($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 5019 %}
kvn@4001 5020 ins_pipe( pipe_slow );
kvn@4001 5021 %}
kvn@4001 5022
kvn@4001 5023 instruct vxor4B_reg(vecS dst, vecS src1, vecS src2) %{
kvn@4001 5024 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 4);
kvn@4001 5025 match(Set dst (XorV src1 src2));
kvn@4001 5026 format %{ "vpxor $dst,$src1,$src2\t! xor vectors (4 bytes)" %}
kvn@4001 5027 ins_encode %{
kvn@4001 5028 bool vector256 = false;
kvn@4001 5029 __ vpxor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 5030 %}
kvn@4001 5031 ins_pipe( pipe_slow );
kvn@4001 5032 %}
kvn@4001 5033
kvn@4001 5034 instruct vxor8B(vecD dst, vecD src) %{
kvn@4001 5035 predicate(n->as_Vector()->length_in_bytes() == 8);
kvn@4001 5036 match(Set dst (XorV dst src));
kvn@4001 5037 format %{ "pxor $dst,$src\t! xor vectors (8 bytes)" %}
kvn@4001 5038 ins_encode %{
kvn@4001 5039 __ pxor($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 5040 %}
kvn@4001 5041 ins_pipe( pipe_slow );
kvn@4001 5042 %}
kvn@4001 5043
kvn@4001 5044 instruct vxor8B_reg(vecD dst, vecD src1, vecD src2) %{
kvn@4001 5045 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 8);
kvn@4001 5046 match(Set dst (XorV src1 src2));
kvn@4001 5047 format %{ "vpxor $dst,$src1,$src2\t! xor vectors (8 bytes)" %}
kvn@4001 5048 ins_encode %{
kvn@4001 5049 bool vector256 = false;
kvn@4001 5050 __ vpxor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 5051 %}
kvn@4001 5052 ins_pipe( pipe_slow );
kvn@4001 5053 %}
kvn@4001 5054
kvn@4001 5055 instruct vxor16B(vecX dst, vecX src) %{
kvn@4001 5056 predicate(n->as_Vector()->length_in_bytes() == 16);
kvn@4001 5057 match(Set dst (XorV dst src));
kvn@4001 5058 format %{ "pxor $dst,$src\t! xor vectors (16 bytes)" %}
kvn@4001 5059 ins_encode %{
kvn@4001 5060 __ pxor($dst$$XMMRegister, $src$$XMMRegister);
kvn@4001 5061 %}
kvn@4001 5062 ins_pipe( pipe_slow );
kvn@4001 5063 %}
kvn@4001 5064
kvn@4001 5065 instruct vxor16B_reg(vecX dst, vecX src1, vecX src2) %{
kvn@4001 5066 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 5067 match(Set dst (XorV src1 src2));
kvn@4001 5068 format %{ "vpxor $dst,$src1,$src2\t! xor vectors (16 bytes)" %}
kvn@4001 5069 ins_encode %{
kvn@4001 5070 bool vector256 = false;
kvn@4001 5071 __ vpxor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 5072 %}
kvn@4001 5073 ins_pipe( pipe_slow );
kvn@4001 5074 %}
kvn@4001 5075
kvn@4001 5076 instruct vxor16B_mem(vecX dst, vecX src, memory mem) %{
kvn@4001 5077 predicate(UseAVX > 0 && n->as_Vector()->length_in_bytes() == 16);
kvn@4001 5078 match(Set dst (XorV src (LoadVector mem)));
kvn@4001 5079 format %{ "vpxor $dst,$src,$mem\t! xor vectors (16 bytes)" %}
kvn@4001 5080 ins_encode %{
kvn@4001 5081 bool vector256 = false;
kvn@4001 5082 __ vpxor($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 5083 %}
kvn@4001 5084 ins_pipe( pipe_slow );
kvn@4001 5085 %}
kvn@4001 5086
kvn@4001 5087 instruct vxor32B_reg(vecY dst, vecY src1, vecY src2) %{
kvn@4001 5088 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 5089 match(Set dst (XorV src1 src2));
kvn@4001 5090 format %{ "vpxor $dst,$src1,$src2\t! xor vectors (32 bytes)" %}
kvn@4001 5091 ins_encode %{
kvn@4001 5092 bool vector256 = true;
kvn@4001 5093 __ vpxor($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector256);
kvn@4001 5094 %}
kvn@4001 5095 ins_pipe( pipe_slow );
kvn@4001 5096 %}
kvn@4001 5097
kvn@4001 5098 instruct vxor32B_mem(vecY dst, vecY src, memory mem) %{
kvn@4001 5099 predicate(UseAVX > 1 && n->as_Vector()->length_in_bytes() == 32);
kvn@4001 5100 match(Set dst (XorV src (LoadVector mem)));
kvn@4001 5101 format %{ "vpxor $dst,$src,$mem\t! xor vectors (32 bytes)" %}
kvn@4001 5102 ins_encode %{
kvn@4001 5103 bool vector256 = true;
kvn@4001 5104 __ vpxor($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector256);
kvn@4001 5105 %}
kvn@4001 5106 ins_pipe( pipe_slow );
kvn@4001 5107 %}
kvn@4001 5108

mercurial